Encuentra qué versión de paquete está instalada con pip

710

Usando pip, ¿es posible averiguar qué versión de un paquete está instalada actualmente?

Lo sé pip install XYZ --upgradepero me pregunto si hay algo así pip info XYZ. Si no, ¿cuál sería la mejor manera de saber qué versión estoy usando actualmente?

Alexis
fuente
44
hay una propuesta para un showcomando en pip: github.com/pypa/pip/issues/33
Hugo Tavares

Respuestas:

1014

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
AdamKG
fuente
8
@techtonik: es para congelar los módulos actuales a un require.txt .
Hugo
@Hugo: usaría el savenombre.
anatoly techtonik
55
El nombre de 'congelar' es histórico: se remonta al menos a 2008 . En ese momento, muchas personas ya estaban familiarizadas con las gemas de rubí "congeladas", por lo que pip tomó prestado el nombre entonces ampliamente utilizado.
AdamKG
2
esto no era obvio ni estaba documentado, pero puede escribir pip show pippara obtener la información de la versión de pip, en lugar de pip --versionlo que esperaba.
Marc Maxmeister el
pip freezetiene la ventaja de que muestra las versiones de pago VCS editables correctamente, mientras pip showque no.
spookylukey
63

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
BernardoBarreto
fuente
2
Parece que ya está fusionado .
anatoly techtonik
43

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)
RickyA
fuente
Digamos que el nombre del paquete es X. Para encontrar la versión: ¿cuál es la diferencia entre usar la lista de pip y hacer una importación X y luego X .__ versión__? ¿Ambas son las versiones del paquete?
variable
ambos son válidos, pero pip listson genéricos y __version__no lo son. También he visto version()y get_version()para el importado.
RickyA
35

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

KevinS
fuente
1
Una opción interesante Sin embargo, prefiero que haga una lista de todos ellos y me avise si alguno de ellos está desactualizado.
ArtOfWarfare
17

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 
Gustavo
fuente
9

Puede usar el comando grep para averiguarlo.

pip show <package_name>|grep Version

Ejemplo:

pip show urllib3|grep Version

solo mostrará las versiones.

Versión de metadatos:
Versión 2.0 : 1.12

Rajiv
fuente
8

La forma más fácil es esta:

import jinja2
print jinja2.__version__
user5730083
fuente
77
Esto solo funciona para paquetes que se han definido __version__en su código fuente. Muchos paquetes no.
spookylukey
¿Es una buena práctica incluir esta versión mientras se empaqueta o es una buena práctica tener solo la versión en el parámetro de versión del archivo setup.py?
variable
Este método tampoco es robusto para empacar inconsistencias de nombres (hay al menos 3 tipos) entre la entrada esperada de importy la salida de pip freeze.
mirekphd
6

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:

ingrese la descripción de la imagen aquí

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ó ...

Ola Tuvesson
fuente
Cómo ejecutar esto en windows
vela
1
@vela Espero que funcione exactamente igual en Windows. Por supuesto , primero tendría que instalarlo , como lo haría en cualquier sistema.
Ola Tuvesson el
5

En Windows, puede emitir comandos como:

pip show setuptools | findstr "Version"

Salida:

Version: 34.1.1
Quinn
fuente
2

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
mirekphd
fuente
1
¿Por qué no usar importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc
1
Gran descubrimiento @sinoroc! Creo que deberías publicarlo como respuesta, y eliminaré mi más bien diseñada :) Ejemplo de PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd
1
Te dejaré ir por ello
sinoroc
Tus nuevas ediciones me sorprenden. ¿Podrías intentarlo python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc
Esa le da la respuesta correcta: la última versión instalada (2.3.1), cuando 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).
mirekphd
1

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:
Súper piedra
fuente
No es una respuesta estándar.
Hamed baziyad
1

Para hacer esto usando el código Python:

Utilizando 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'

Utilizando 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 .

Acumenus
fuente
0

Para Windows puedes

  1. abra cmd y escriba python, presione enter.

  2. escriba la importación y presione enter.

  3. escriba ._version__ y presione enter.

Como puede ver en la captura de pantalla aquí, estoy usando este método para verificar la versión del módulo en serie.

Imagen


joker2368
fuente
0

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

Ashwani Singh
fuente