Risposte:
A partire dal pip 1.3 , c'è un pip show
comando.
$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
Nelle versioni precedenti, pip freeze
e grep
dovrebbe fare bene il lavoro.
$ pip freeze | grep Jinja2
Jinja2==2.7.3
save
nome.
pip show pip
per ottenere le informazioni sulla versione di pip, piuttosto che pip --version
come mi sarei aspettato.
pip freeze
ha il vantaggio di mostrare correttamente le versioni modificabili di checkout VCS, mentre pip show
non lo è.
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
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)
pip list
è generico e __version__
non lo è. Ho anche visto version()
e get_version()
per quello importato.
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
Puoi anche installare yolk
ed eseguire, il yolk -l
che 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
Il modo più semplice è questo:
import jinja2
print jinja2.__version__
__version__
nel loro codice sorgente. Molti pacchetti no.
import
e l'output di pip freeze
.
C'è anche uno strumento chiamato pip-check
che ti offre una rapida panoramica di tutti i pacchetti installati e il loro stato di aggiornamento:
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 ...
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_name
parametro deve contenere il nome del pacchetto nel formato restituito pip freeze
e non utilizzato durante import
, ad esempio scikit-learn
no sklearn
o Flask-Caching
no flask_caching
.
Si noti che mentre si richiama pip freeze
nella 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 sklearn
vsscikit-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 numpy
disponibile in PyPI il 04-01-2020 era la 1.18.0, mentre allo stesso tempo il conda-forge
canale di Anaconda aveva solo la versione 1.17.3 numpy
come ultima. Quindi, quando hai installato un basemap
pacchetto con conda (come secondo), il tuo pip precedentemente installato numpy
verrebbe declassato da conda a 1.17.3 e la versione 1.18.0 diventerebbe non disponibile per la import
funzione. In questo caso version()
sarebbe giusto e pip freeze
/ conda list
sbagliato:
$ 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
importlib.metadata.version('NameOfProject')
? docs.python.org/3/library/…
from importlib_metadata import version; version('Flask-Caching')
python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"
?
version()
restituisce ancora la prima (la più vecchia) (2.2.3). È possibile replicare questo risultato installando entrambe le versioni con lo --user
switch, ma preservando manualmente la lightgbm-2.2.3.dist-info
cartella, per avere entrambe insieme, come elencato sopra (pip normalmente lo rimuove - fino a quando non lo fa).
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:
Per fare ciò usando il codice Python:
importlib.metadata.version
import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'
(usando importlib_metadata.version
)
!pip install importlib-metadata
import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'
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 .
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
show
comando in pip: github.com/pypa/pip/issues/33