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.