Trova tutti i pacchetti installati con easy_install / pip?


Risposte:


381

pip freezeprodurrà 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


89
A partire dalla versione 1.3 è stato aggiunto "elenco pip". Vedi la mia risposta qui sotto e i documenti qui: pip-installer.org/en/latest/usage.html#pip-list
keybits

7
elenca e blocca l'output di diversi formati (al momento della scrittura). L'output del congelamento può essere utilizzato per ricreare ambienti: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba,

18
pip freezeed pip listelenca tutto. Non escludono i pacchetti che non sono stati installati da pip.
Eliad,

Trovo anche pip freezeaffidabile negli script, mentre pip listgenererà errori imprevisti quando viene utilizzato con le pipe.
Dale Anderson,

2
(?) Il nuovo pip list -lo pip list --localè la migliore risposta, vedere stackoverflow.com/a/43012269/491884 da @MJB
jmuc

255

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/


3
Su Gentoo, questo elenca tutti i pacchetti, anche quelli installati con mezzi diversi da pip. Questo esclude davvero i moduli non pip installati su un altro sistema come richiesto dalla domanda?
jlh

Si noti che questo è leggermente diverso dapip freeze
sg

1
pip list --usermostra solo i pacchetti installati dall'utente ed esclude i pacchetti a livello di sistema.
Jacob Hume,

138

Se qualcuno si sta chiedendo, puoi usare il comando 'pip show'.

pip show [options] <package>

Questo elencherà la directory di installazione del pacchetto specificato.


24

Se Debian si comporta come le recenti versioni di Ubuntu per quanto riguarda la pip installdestinazione predefinita, è molto semplice: si installa /usr/local/lib/invece di /usr/lib( aptdestinazione 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 packagefa parte del ritorno dà quando nessun pacchetto possiede il file: error: No package owns $FILENAME. Soluzione alternativa: sto interrogando __init__.pyperché pacman -Qoè un po 'ignorante quando si tratta di directory :(

Per farlo per altre distro, devi scoprire dove pipinstalla roba (solo sudo pip installqualcosa), 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 -Sfallirà 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'

2
+1 Grazie mille per l'arco one-liner, è esattamente quello che stavo cercando. A proposito, fatto curioso: la mia installazione di Arch è localizzata in italiano, ma grep ha "corrotto" correttamente le righe che dicevano "Nessun pacchetto" (anche se ho cercato "Nessun pacchetto"). Come mai?
Nadir Sampaoli,

1
@barraponto @NadirSampaoli grep non fa nulla nel mio caso. Perché grep prova a grep in stdout, ma dpkgscrivo 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/"
finisco

1
ciao, ho annullato il voto per errore e me ne sono appena reso conto, e ora il mio voto è bloccato. Qualcuno potrebbe votare questo per neutralizzare il mio voto negativo? Grazie
Jonathan,

22

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    

Migliore risposta IMHO. Davvero semplice e veloce se conosco il nome del pacchetto. L'elenco pip non è nemmeno necessario e il congelamento può richiedere molto tempo e devo filtrare le cose che non mi interessano. Semplice: pip show my_packge
ChuckZ

8

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

2
Questo non funzionerà più. Vedi github.com/pypa/pip/issues/5243 Invece dovresti usare: import pkg_resources [print (d.project_name) per d in pkg_resources.working_set]
Almenon

6

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 listfornire 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)
$

Perché non presentare il biglietto da soli?
lajarre,

1
Apparentemente la prossima versione di pip avrà un nuovo comando list: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

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.


5

Le versioni più recenti di pip hanno la possibilità di fare ciò che l'OP vuole tramite pip list -lo 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.


1
risulta che abbiamo avuto pip freeze --localper 8 anni. pip list --localè disponibile anche ... ma nota che la domanda OP non riguarda gli ambienti virtuali (che --localsupportano) ma di discernere i pacchetti di distribuzione dai sudo pip installpacchetti.
Capi Etheriel,

4

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 listrestituito l'errore The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.


pip è per python2.7, pip3 è per python3.x
mjp

3

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


2

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:'

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.


1

pip freeze elenca tutti i pacchetti installati anche se non tramite pip / easy_install. Su CentOs / Redhat viene trovato un pacchetto installato tramite rpm.


1

Se si utilizza la distribuzione Anaconda Python, è possibile utilizzare il conda listcomando 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 pipse 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 pipse 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 -yflag per pip uninstallevitare di dover dare conferma dell'eliminazione.


1

Per coloro che non hanno installato pip, ho trovato questo veloce script su github (funziona con Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]


0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.