Trova quale versione del pacchetto è installata con pip


710

Usando pip, è possibile capire quale versione di un pacchetto è attualmente installata?

Lo so, pip install XYZ --upgradema mi chiedo se ci sia qualcosa di simile pip info XYZ. Altrimenti quale sarebbe il modo migliore per dire quale versione sto attualmente utilizzando.


4
c'è una proposta per un showcomando in pip: github.com/pypa/pip/issues/33
Hugo Tavares,

Risposte:


1014

A partire dal pip 1.3 , c'è un pip showcomando.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

Nelle versioni precedenti, pip freezee grepdovrebbe fare bene il lavoro.

$ pip freeze | grep Jinja2
Jinja2==2.7.3

8
@techtonik: serve per congelare i moduli attuali in un requisito.txt.
Hugo,

@Hugo: userei il savenome.
Anatoly Techtonik,

5
La denominazione di "congelamento" è storica - risale almeno al 2008 . All'epoca, molte persone avevano già familiarità con le gemme "congelanti" di rubini, quindi Pip prese in prestito il nome allora ampiamente usato.
AdamKG,

2
questo non era ovvio né documentato, ma puoi digitare pip show pipper ottenere le informazioni sulla versione di pip, piuttosto che pip --versioncome mi sarei aspettato.
Marc Maxmeister, l'

pip freezeha il vantaggio di mostrare correttamente le versioni modificabili di checkout VCS, mentre pip shownon lo è.
spookylukey,

63

Ho appena inviato una richiesta pull in pip con il miglioramento Hugo Tavares ha detto:

(specloud come esempio)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

2
Sembra che sia già stato unito .
Anatoly Techtonik,

43

Pip 1.3 ora ha anche un comando list :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

Supponiamo che il nome del pacchetto sia X. Per trovare la versione - Qual è la differenza tra l'utilizzo dell'elenco pip e l'esecuzione dell'importazione X e quindi X .__ versione__? Sono entrambe le versioni del pacchetto?
variabile

entrambi sono validi, ma pip listè generico e __version__non lo è. Ho anche visto version()e get_version()per quello importato.
Ricky,

35

e con --outdated come argomento aggiuntivo, otterrai le versioni Current e Latest dei pacchetti che stai usando:

$ pip list --outdated
distribute (Current: 0.6.34 Latest: 0.7.3)
django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)
Django (Current: 1.5.4 Latest: 1.6.4)
Jinja2 (Current: 2.6 Latest: 2.8)

Quindi, combinando con la risposta di AdamKG:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Controlla anche pip-tools : https://github.com/nvie/pip-tools


1
Un'opzione interessante. Preferirei che li elencasse tutti, e fammi sapere se qualcuno di loro è obsoleto, però.
ArtOfWarfare

17

Puoi anche installare yolked eseguire, il yolk -lche dà anche un bel risultato. Ecco cosa ottengo per il mio piccolo virtualenv:

(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittest 
project@pyramid 43> yolk -l
Chameleon       - 2.8.2        - active 
Jinja2          - 2.6          - active 
Mako            - 0.7.0        - active 
MarkupSafe      - 0.15         - active 
PasteDeploy     - 1.5.0        - active 
Pygments        - 1.5          - active 
Python          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy      - 0.7.6        - active 
WebOb           - 1.2b3        - active 
account         - 0.0          - active development (/space/vhosts/pyramid.xcode.com/project/account)
distribute      - 0.6.19       - active 
egenix-mx-base  - 3.2.3        - active 
ipython         - 0.12         - active 
logilab-astng   - 0.23.1       - active 
logilab-common  - 0.57.1       - active 
nose            - 1.1.2        - active 
pbkdf2          - 1.3          - active 
pip             - 1.0.2        - active 
pyScss          - 1.1.3        - active 
pycrypto        - 2.5          - active 
pylint          - 0.25.1       - active 
pyramid-debugtoolbar - 1.0.1        - active 
pyramid-tm      - 0.4          - active 
pyramid         - 1.3          - active 
repoze.lru      - 0.5          - active 
simplejson      - 2.5.0        - active 
transaction     - 1.2.0        - active 
translationstring - 1.1          - active 
venusian        - 1.0a3        - active 
waitress        - 0.8.1        - active 
wsgiref         - 0.1.2        - active development (/usr/lib/python2.7)
yolk            - 0.4.3        - active 
zope.deprecation - 3.5.1        - active 
zope.interface  - 3.8.0        - active 
zope.sqlalchemy - 0.7          - active 

9

Puoi usare il comando grep per scoprirlo.

pip show <package_name>|grep Version

Esempio:

pip show urllib3|grep Version

mostrerà solo le versioni.

Versione metadati:
Versione 2.0 : 1.12


8

Il modo più semplice è questo:

import jinja2
print jinja2.__version__

7
Questo funziona solo per i pacchetti che sono stati definiti __version__nel loro codice sorgente. Molti pacchetti no.
spookylukey,

È buona norma includere questa versione durante il packaging o è buona norma avere la versione solo nel parametro versione del file setup.py?
variabile

Questo metodo non è inoltre affidabile per impacchettare incoerenze nella denominazione (esistono almeno 3 tipi) tra l'input previsto di importe l'output di pip freeze.
mirekphd,

6

C'è anche uno strumento chiamato pip-checkche ti offre una rapida panoramica di tutti i pacchetti installati e il loro stato di aggiornamento:

inserisci qui la descrizione dell'immagine

Non l'ho usato da solo; ci siamo imbattuti in questo e in questa domanda SO in rapida successione, e dal momento che non è stato menzionato ...


Come eseguirlo su windows
vela

1
@vela mi aspetto che funzioni esattamente allo stesso modo su Windows. Ovviamente dovresti installarlo prima, come faresti su qualsiasi sistema.
Ola Tuvesson,

5

Su Windows, puoi emettere comandi come:

pip show setuptools | findstr "Version"

Produzione:

Version: 34.1.1

2

La funzione python restituisce solo la versione del pacchetto in un formato leggibile dalla macchina:

from importlib.metadata import version 
version('numpy')

Prima di Python 3.8:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

L'equivalente bash (qui anche invocato da Python) sarebbe molto più complesso (ma più robusto - vedi attenzione sotto):

import subprocess
def get_installed_ver(pkg_name):
    bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d '\n'" %(pkg_name)
    return(subprocess.check_output(bash_str, shell=True).decode())

Esempio di utilizzo:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22

Si noti che in entrambi i casi il pkg_nameparametro deve contenere il nome del pacchetto nel formato restituito pip freezee non utilizzato durante import, ad esempio scikit-learnno sklearno Flask-Cachingno flask_caching.

Si noti che mentre si richiama pip freezenella versione bash può sembrare inefficiente, solo questo metodo si rivela sufficientemente robusto per impacchettare peculiarità e incoerenze nella denominazione (ad esempio caratteri di sottolineatura vs trattini, maiuscole / minuscole e abbreviazioni come sklearnvsscikit-learn ).

Attenzione: in ambienti complessi entrambe le varianti possono restituire numeri di versione a sorpresa, in contrasto con ciò che si può effettivamente ottenere durante import.

Uno di questi problemi si presenta quando ci sono altre versioni del pacchetto nascoste in una sottocartella utente site-packages . Come illustrazione dei pericoli dell'utilizzo version()ecco una situazione che ho riscontrato:

$ pip freeze | grep lightgbm
lightgbm==2.3.1

and

$ python -c "import lightgbm; print(lightgbm.__version__)"
2.3.1

vs.

$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"
2.2.3

until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):

$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.2.3.dist-info
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.3.1.dist-info

Un altro problema è avere alcuni pacchetti installati in conda nello stesso ambiente. Se condividono dipendenze con i pacchetti installati su pip e le versioni di queste dipendenze differiscono, è possibile che si verifichino downgrade delle dipendenze installate su pip.

Per illustrare, l'ultima versione numpydisponibile in PyPI il 04-01-2020 era la 1.18.0, mentre allo stesso tempo il conda-forgecanale di Anaconda aveva solo la versione 1.17.3 numpycome ultima. Quindi, quando hai installato un basemappacchetto con conda (come secondo), il tuo pip precedentemente installato numpyverrebbe declassato da conda a 1.17.3 e la versione 1.18.0 diventerebbe non disponibile per la importfunzione. In questo caso version()sarebbe giusto e pip freeze/ conda listsbagliato:

$ python -c "from importlib_metadata import version; print(version(\"numpy\"))"
1.17.3

$ python -c "import numpy; print(numpy.__version__)"
1.17.3

$ pip freeze | grep numpy
numpy==1.18.0

$ conda list | grep numpy
numpy                     1.18.0                   pypi_0    pypi

1
Perché non usare importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc il

1
Grande scoperta @sinoroc! Penso che dovresti pubblicarlo come risposta, ed eliminerò il mio piuttosto ingegnerizzato :) Esempio PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd

1
Ti lascio andare per questo
sinoroc

Le tue ultime modifiche mi sorprendono. Potresti provare python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc

Quella ti dà la risposta corretta - l'ultima versione installata (2.3.1), quando version()restituisce ancora la prima (la più vecchia) (2.2.3). È possibile replicare questo risultato installando entrambe le versioni con lo --userswitch, ma preservando manualmente la lightgbm-2.2.3.dist-infocartella, per avere entrambe insieme, come elencato sopra (pip normalmente lo rimuove - fino a quando non lo fa).
mirekphd,

1

pip show funziona in Python 3.7:

pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg
Requires: urllib3
Required-by:

Non è una risposta standard.
hamed baziyad,

1

Per fare ciò usando il codice Python:

utilizzando importlib.metadata.version

Python ≥3,8

import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'

Python ≤3.7

(usando importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

utilizzando pkg_resources.Distribution

import pkg_resources
pkg_resources.get_distribution('beautifulsoup4').version
'4.9.1'
pkg_resources.get_distribution('beautifulsoup4').parsed_version
<Version('4.9.1')>

Accreditato ai commenti di sinoroc e mirekphd .


0

Per Windows puoi

  1. apri cmd e digita python, premi invio.

  2. digitare l'importazione e premere invio.

  3. digitare ._version__ e premere invio.

Come puoi vedere nella schermata qui sto usando questo metodo per verificare la versione del modulo seriale.

Immagine



0

In questione, non viene menzionato quale utente del sistema operativo sta utilizzando (Windows / Linux / Mac)

Poiché ci sono un paio di risposte che funzioneranno perfettamente su Mac e Linux.

Il comando seguente può essere utilizzato nel caso in cui l'utente stia cercando di trovare la versione di un pacchetto Python su Windows.

In PowerShell usare il comando seguente:

pip list | findstr <PackageName>

Esempio:- pip list | findstr requests

Produzione : requests 2.18.4

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.