Respuestas:
A partir del pip 1.3 , hay un pip showcomando.
$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
En versiones anteriores, pip freezey grepdebería hacer el trabajo bien.
$ pip freeze | grep Jinja2
Jinja2==2.7.3
savenombre.
pip show pippara obtener la información de la versión de pip, en lugar de pip --versionlo que esperaba.
pip freezetiene la ventaja de que muestra las versiones de pago VCS editables correctamente, mientras pip showque 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 listson 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 yolky luego ejecutar, lo yolk -lque 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.
importy la salida de pip freeze.
También hay una herramienta llamada pip-checkque 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_nameparámetro debe contener el nombre del paquete en el formato que devuelve pip freezey no como se usa durante import, por ejemplo, scikit-learnno sklearno Flask-Cachingno flask_caching.
Tenga en cuenta que si bien invocar pip freezeen 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 sklearnvsscikit-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 numpydisponible en PyPI el 04-01-2020 fue 1.18.0, mientras que al mismo tiempo el conda-forgecanal de Anaconda solo tenía la versión 1.17.3 numpycomo última. Por lo tanto, cuando instaló un basemappaquete con conda (como segundo), su instalación previa en pip numpyse degradaría por conda a 1.17.3, y la versión 1.18.0 dejaría de estar disponible para la importfunción. En este caso version()sería correcto y pip freeze/ o conda listincorrecto:
$ 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 --userconmutador, pero conservando manualmente la lightgbm-2.2.3.dist-infocarpeta, 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.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')>
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
showcomando en pip: github.com/pypa/pip/issues/33