Risposte:
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
savenome.
pip show pipper ottenere le informazioni sulla versione di pip, piuttosto che pip --versioncome mi sarei aspettato.
pip freezeha il vantaggio di mostrare correttamente le versioni modificabili di checkout VCS, mentre pip shownon 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 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
Il modo più semplice è questo:
import jinja2
print jinja2.__version__
__version__nel loro codice sorgente. Molti pacchetti no.
importe l'output di pip freeze.
C'è anche uno strumento chiamato pip-checkche 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_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
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 --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).
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.versionimport 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.Distributionimport 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
showcomando in pip: github.com/pypa/pip/issues/33