Respuestas:
A partir del pip 1.3 , hay un pip show
comando.
$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
En versiones anteriores, pip freeze
y grep
debería hacer el trabajo bien.
$ pip freeze | grep Jinja2
Jinja2==2.7.3
save
nombre.
pip show pip
para obtener la información de la versión de pip, en lugar de pip --version
lo que esperaba.
pip freeze
tiene la ventaja de que muestra las versiones de pago VCS editables correctamente, mientras pip show
que no.
Acabo de enviar una solicitud de extracción en pip con la mejora que Hugo Tavares dijo:
(Specloud como ejemplo)
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Pip 1.3 ahora también tiene un comando de lista :
$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
pip list
son genéricos y __version__
no lo son. También he visto version()
y get_version()
para el importado.
y con --actualizado como argumento adicional, obtendrá las versiones actual y más reciente de los paquetes que está utilizando:
$ 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)
Entonces, combinando con la respuesta de AdamKG:
$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)
Compruebe también las herramientas PIP: https://github.com/nvie/pip-tools
También puede instalar yolk
y luego ejecutar, lo yolk -l
que también da una buena salida. Esto es lo que obtengo por mi pequeño 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
La forma más fácil es esta:
import jinja2
print jinja2.__version__
__version__
en su código fuente. Muchos paquetes no.
import
y la salida de pip freeze
.
También hay una herramienta llamada pip-check
que le brinda una visión general rápida de todos los paquetes instalados y su estado de actualización:
No lo he usado yo mismo; simplemente me topé con esto y esta pregunta SO en rápida sucesión, y como no se mencionó ...
La función python devuelve solo la versión del paquete en un formato legible por máquina:
from importlib.metadata import version
version('numpy')
Antes de Python 3.8:
pip install importlib-metadata
from importlib_metadata import version
version('numpy')
El equivalente de bash (aquí también invocado desde python) sería mucho más complejo (pero más robusto; consulte la precaución a continuación):
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())
Uso de la muestra:
# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"
print(get_installed_ver(pkg_name))
>>> 0.22
Tenga en cuenta que, en ambos casos, el pkg_name
parámetro debe contener el nombre del paquete en el formato que devuelve pip freeze
y no como se usa durante import
, por ejemplo, scikit-learn
no sklearn
o Flask-Caching
no flask_caching
.
Tenga en cuenta que si bien invocar pip freeze
en la versión bash puede parecer ineficiente, solo este método demuestra ser lo suficientemente robusto para empaquetar las peculiaridades e inconsistencias de los nombres (por ejemplo, guiones bajos vs guiones, mayúsculas pequeñas y grandes, y abreviaturas como sklearn
vsscikit-learn
).
Precaución: en entornos complejos, ambas variantes pueden devolver números de versión sorpresa, inconsistentes con lo que realmente puede obtener durante import
.
Uno de estos problemas surge cuando hay otras versiones del paquete ocultas en una subcarpeta de usuario site-packages
. Como ilustración de los peligros del uso version()
, he aquí una situación que encontré:
$ 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
Otro problema es tener algunos paquetes instalados conda en el mismo entorno. Si comparten dependencias con sus paquetes instalados con pip, y las versiones de estas dependencias difieren, puede obtener una degradación de sus dependencias instaladas con pip.
Para ilustrar, la última versión de numpy
disponible en PyPI el 04-01-2020 fue 1.18.0, mientras que al mismo tiempo el conda-forge
canal de Anaconda solo tenía la versión 1.17.3 numpy
como última. Por lo tanto, cuando instaló un basemap
paquete con conda (como segundo), su instalación previa en pip numpy
se degradaría por conda a 1.17.3, y la versión 1.18.0 dejaría de estar disponible para la import
función. En este caso version()
sería correcto y pip freeze
/ o conda list
incorrecto:
$ 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()
aún devuelve la primera (la más antigua) (2.2.3). Puede replicar este resultado instalando ambas versiones con el --user
conmutador, pero conservando manualmente la lightgbm-2.2.3.dist-info
carpeta, para tener ambas juntas, como se enumeró anteriormente (pip normalmente lo eliminaría, hasta que no lo haga).
pip show funciona en 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:
Para hacer esto usando el código 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')>
Acreditado a los comentarios de sinoroc y mirekphd .
En cuestión, no se menciona qué usuario del sistema operativo está utilizando (Windows / Linux / Mac)
Como hay un par de respuestas que funcionarán perfectamente en Mac y Linux.
El siguiente comando se puede usar en caso de que el usuario intente encontrar la versión de un paquete de Python en Windows.
En PowerShell, use el siguiente comando:
pip list | findstr <PackageName>
Ejemplo:- pip list | findstr requests
Salida: requests 2.18.4
show
comando en pip: github.com/pypa/pip/issues/33