C'è un modo per trovare tutti i pacchetti Python Python che sono stati installati con easy_install o pip? Voglio dire, escludendo tutto ciò che era / è installato con gli strumenti di distribuzione (in questo caso apt-get su Debian).
C'è un modo per trovare tutti i pacchetti Python Python che sono stati installati con easy_install o pip? Voglio dire, escludendo tutto ciò che era / è installato con gli strumenti di distribuzione (in questo caso apt-get su Debian).
Risposte:
pip freeze
produrrà un elenco di pacchetti installati e le loro versioni. Inoltre, consente di scrivere quei pacchetti in un file che può essere successivamente utilizzato per configurare un nuovo ambiente.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
ed pip list
elenca tutto. Non escludono i pacchetti che non sono stati installati da pip
.
pip freeze
affidabile negli script, mentre pip list
genererà errori imprevisti quando viene utilizzato con le pipe.
pip list -l
o pip list --local
è la migliore risposta, vedere stackoverflow.com/a/43012269/491884 da @MJB
A partire dalla versione 1.3 di pip è ora possibile utilizzare pip list
Ha alcune opzioni utili tra cui la possibilità di mostrare pacchetti obsoleti. Ecco la documentazione: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
mostra solo i pacchetti installati dall'utente ed esclude i pacchetti a livello di sistema.
Se qualcuno si sta chiedendo, puoi usare il comando 'pip show'.
pip show [options] <package>
Questo elencherà la directory di installazione del pacchetto specificato.
Se Debian si comporta come le recenti versioni di Ubuntu per quanto riguarda la pip install
destinazione predefinita, è molto semplice: si installa /usr/local/lib/
invece di /usr/lib
( apt
destinazione predefinita). Controlla /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747
Sono un utente ArchLinux e mentre sperimentavo pip ho riscontrato lo stesso problema. Ecco come l'ho risolto in Arch.
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
La chiave qui è /usr/lib/python2.7/site-packages
, che è la directory che pip installa, YMMV. pacman -Qo
è come di Arch pac Kage uomo controlli ager per la proprietà del file. No package
fa parte del ritorno dà quando nessun pacchetto possiede il file: error: No package owns $FILENAME
. Soluzione alternativa: sto interrogando __init__.py
perché pacman -Qo
è un po 'ignorante quando si tratta di directory :(
Per farlo per altre distro, devi scoprire dove pip
installa roba (solo sudo pip install
qualcosa), come interrogare la proprietà di un file (metodo Debian / Ubuntu dpkg -S
) e qual è il ritorno "nessun pacchetto possiede quel percorso" (Debian / Ubuntu è no path found matching pattern
). Utenti Debian / Ubuntu, attenzione: dpkg -S
fallirà se si fornisce un collegamento simbolico. Basta risolverlo prima usando realpath
. Come questo:
find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
Gli utenti di Fedora possono provare (grazie @eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
dpkg
scrivo l'errore su stderr, quindi devo aggiungere un reindirizzamento 2>&1
. E per l'output internazionale aggiungere LANG=
di fronte xargs dpkg -s
. ed sed
è anche uno strumento utile;) per mantenere solo il nome del pacchetto del percorso. Quindi find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
Iniziare con:
$ pip list
Per elencare tutti i pacchetti. Una volta trovato il pacchetto desiderato, utilizzare:
$ pip show <package-name>
Questo ti mostrerà i dettagli di questo pacchetto, inclusa la sua cartella. Puoi saltare la prima parte se conosci già il nome del pacchetto
Fare clic qui per maggiori informazioni su pip show e qui per maggiori informazioni su pip list.
Esempio:
$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
pip.get_installed_distributions()
fornirà un elenco di pacchetti installati
import pip
from os.path import join
for package in pip.get_installed_distributions():
print(package.location) # you can exclude packages that's in /usr/XXX
print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
Di seguito è un po 'lento, ma fornisce un elenco di pacchetti ben formattato di cui pip
è a conoscenza. Vale a dire, non tutti sono stati installati "da" pip, ma tutti dovrebbero essere in grado di essere aggiornati da pip.
$ pip search . | egrep -B1 'INSTALLED|LATEST'
Il motivo per cui è lento è che elenca i contenuti dell'intero repository pypi. Ho presentato un biglietto suggerendo di pip list
fornire funzionalità simili ma in modo più efficiente.
Output di esempio: (limitato la ricerca a un sottoinsieme invece di '.' Per tutti.)
$ pip search selenium | egrep -B1 'INSTALLED|LATEST'
selenium - Python bindings for Selenium
INSTALLED: 2.24.0
LATEST: 2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
INSTALLED: 1.0.1 (latest)
$
Aggiungendo alla risposta di @Paul Woolcock,
pip freeze > requirements.txt
creerà un file dei requisiti con tutti i pacchetti installati insieme ai numeri di versione installati nell'ambiente attivo nella posizione corrente. In esecuzione
pip install -r requirements.txt
installerà i pacchetti specificati nel file dei requisiti.
Le versioni più recenti di pip hanno la possibilità di fare ciò che l'OP vuole tramite pip list -l
o pip freeze -l
( --list
).
Su Debian (almeno) la pagina man non lo chiarisce, e l'ho scoperto solo con il presupposto che la funzione debba esistere pip list --help
.
Ci sono commenti recenti che suggeriscono che questa funzione non è ovvia né nella documentazione né nelle risposte esistenti (anche se suggerite da alcuni), quindi ho pensato che avrei dovuto postare. Avrei preferito farlo come commento, ma non ho i punti reputazione.
pip freeze --local
per 8 anni. pip list --local
è disponibile anche ... ma nota che la domanda OP non riguarda gli ambienti virtuali (che --local
supportano) ma di discernere i pacchetti di distribuzione dai sudo pip install
pacchetti.
Si noti che se sul proprio computer sono installate più versioni di Python, è possibile che siano associate alcune versioni di pip.
A seconda delle associazioni, potrebbe essere necessario essere molto cauti su quale comando pip si utilizza:
pip3 list
Ha funzionato per me, dove eseguo Python3.4. Semplicemente usando pip list
restituito l'errore The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip
.
Come sottolineato da @almenon, questo non funziona più e non è il modo supportato per ottenere informazioni sul pacchetto nel codice. Quanto segue solleva un'eccezione:
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
Per fare ciò, è possibile importare pkg_resources
. Ecco un esempio:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
Sono su v3.6.5
Ecco il one-liner per fedora o altre distribuzioni rpm (basato sui suggerimenti di @barraponto):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Aggiungi questo al comando precedente per ottenere un output più pulito:
| sed -r 's:.*/(\w+)/__.*:\1:'
Ottieni tutti i nomi di file / cartelle site-packages/
(e dist-packages/
se esiste) e usa il tuo gestore pacchetti per eliminare quelli installati tramite pacchetto.
pip freeze elenca tutti i pacchetti installati anche se non tramite pip / easy_install. Su CentOs / Redhat viene trovato un pacchetto installato tramite rpm.
Se si utilizza la distribuzione Anaconda Python, è possibile utilizzare il conda list
comando per vedere cosa è stato installato con quale metodo:
user@pc:~ $ conda list
# packages in environment at /anaconda3:
#
# Name Version Build Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36h2fc01ae_0
alabaster 0.7.10 py36h174008c_0
amqp 2.2.2 <pip>
anaconda 5.1.0 py36_2
anaconda-client 1.6.9 py36_0
Per prendere le voci installate da pip
(incluso possibilmente pip
se stesso):
user@pc:~ $ conda list | grep \<pip
amqp 2.2.2 <pip>
astroid 1.6.2 <pip>
billiard 3.5.0.3 <pip>
blinker 1.4 <pip>
ez-setup 0.9 <pip>
feedgenerator 1.9 <pip>
Ovviamente probabilmente vuoi semplicemente selezionare la prima colonna, che puoi fare (escludendo pip
se necessario):
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp
astroid
billiard
blinker
ez-setup
feedgenerator
Finalmente puoi prendere questi valori e pip disinstallarli tutti usando quanto segue:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
Nota l'uso del -y
flag per pip uninstall
evitare di dover dare conferma dell'eliminazione.
elenco pip [opzioni] Puoi vedere il riferimento completo qui
Almeno per Ubuntu (forse anche altri) funziona così (ispirato a un post precedente in questa discussione):
printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo