Rechercher la version du package installée avec pip


710

À l'aide de pip, est-il possible de déterminer quelle version d'un package est actuellement installée?

Je sais, pip install XYZ --upgrademais je me demande s'il y a quelque chose comme ça pip info XYZ. Sinon, quelle serait la meilleure façon de savoir quelle version j'utilise actuellement.


4
il y a une proposition de showcommande dans pip: github.com/pypa/pip/issues/33
Hugo Tavares

Réponses:


1014

Depuis le pip 1.3 , il existe une pip showcommande.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

Dans les anciennes versions, pip freezeet grepdevrait bien faire le travail.

$ pip freeze | grep Jinja2
Jinja2==2.7.3

8
@techtonik: C'est pour geler les modules actuels dans un requirements.txt.
Hugo

@Hugo: J'utiliserais le savenom.
anatoly techtonik

5
La dénomination de «gel» est historique - elle remonte au moins à 2008 . À l'époque, beaucoup de gens connaissaient déjà les gemmes de rubis "glaciales", alors pip a emprunté le nom alors largement utilisé.
AdamKG

2
ce n'était pas évident ni documenté, mais vous pouvez taper pip show pippour obtenir les informations de version de pip, plutôt que pip --versioncomme je m'y attendais.
Marc Maxmeister

pip freezeprésente l'avantage d'afficher correctement les versions de contrôle VCS modifiables, alors que ce pip shown'est pas le cas.
spookylukey

63

Je viens d'envoyer une demande de pull dans pip avec l'amélioration Hugo Tavares a déclaré:

(specloud comme exemple)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

2
On dirait qu'il est déjà fusionné .
anatoly techtonik

43

Pip 1.3 a désormais également une commande list :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

Dites que le nom du package est X. Pour trouver la version - Quelle est la différence entre l'utilisation de la liste pip et l'importation X puis X .__ version__? Sont les deux versions du package?
variable

les deux sont valides, mais pip listsont génériques et __version__ne le sont pas. J'ai aussi vu version()et get_version()pour celui importé.
RickyA

35

et avec --outdated comme argument supplémentaire, vous obtiendrez les versions actuelles et les plus récentes des packages que vous utilisez:

$ 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)

Donc, en combinant avec la réponse d'AdamKG:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Vérifiez également les outils pip : https://github.com/nvie/pip-tools


1
Une option intéressante. Je préférerais qu'il les énumère tous, et faites-moi savoir si certains d'entre eux sont obsolètes, cependant.
ArtOfWarfare

17

Vous pouvez également installer yolkpuis exécuter yolk -lce qui donne également une belle sortie. Voici ce que j'obtiens pour mon petit 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 

9

Vous pouvez utiliser la commande grep pour le savoir.

pip show <package_name>|grep Version

Exemple:

pip show urllib3|grep Version

n'affichera que les versions.

Version des métadonnées:
Version 2.0 : 1.12


8

La façon la plus simple est la suivante:

import jinja2
print jinja2.__version__

7
Cela ne fonctionne que pour les packages qui ont défini __version__dans leur code source. De nombreux packages ne le font pas.
spookylukey

Est-ce une bonne pratique d'inclure cette version lors de l'empaquetage ou est-ce une bonne pratique de n'avoir que la version dans le paramètre de version du fichier setup.py?
variable

Cette méthode n'est pas non plus robuste pour empaqueter les incohérences de nommage (il existe au moins 3 types) entre l'entrée attendue de importet la sortie de pip freeze.
mirekphd

6

Il existe également un outil appelé pip-checkqui vous donne un aperçu rapide de tous les packages installés et de leur état de mise à jour:

entrez la description de l'image ici

Je ne l'ai pas utilisé moi-même; je suis juste tombé dessus et cette question SO en succession rapide, et comme elle n'a pas été mentionnée ...


Comment exécuter cela sur Windows
vela

1
@vela Je m'attends à ce que cela fonctionne exactement de la même manière sous Windows. Bien sûr, vous devez d'abord l' installer , comme vous le feriez sur n'importe quel système.
Ola Tuvesson

5

Sous Windows, vous pouvez exécuter des commandes telles que:

pip show setuptools | findstr "Version"

Production:

Version: 34.1.1

2

La fonction python ne renvoyant que la version du package dans un format lisible par machine:

from importlib.metadata import version 
version('numpy')

Avant python 3.8:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

L'équivalent bash (ici également invoqué depuis python) serait beaucoup plus complexe (mais plus robuste - voir prudence ci-dessous):

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())

Exemple d'utilisation:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22

Notez que dans les deux cas, le pkg_nameparamètre doit contenir le nom du package au format renvoyé par pip freezeet non tel qu'il est utilisé pendant import, par exemple, scikit-learnpas sklearnou Flask-Cachingpas flask_caching.

Notez que bien que l'invocation pip freezedans la version bash puisse sembler inefficace, seule cette méthode s'avère suffisamment robuste pour empaqueter les particularités et les incohérences de nommage (par exemple, les soulignés vs les tirets, les petites vs les grandes majuscules et les abréviations telles que sklearnvs scikit-learn).

Attention: dans les environnements complexes, les deux variantes peuvent renvoyer des numéros de version surprenants, incompatibles avec ce que vous pouvez réellement obtenir pendant import.

Un tel problème se pose lorsqu'il existe d'autres versions du package cachées dans un sous-dossier utilisateur site-packages . Pour illustrer les dangers de l'utilisation, version()voici une situation que j'ai rencontrée:

$ 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 autre problème est d'avoir certains packages installés par conda dans le même environnement. S'ils partagent des dépendances avec vos packages installés par pip et que les versions de ces dépendances diffèrent, vous pouvez obtenir des rétrogradations de vos dépendances installées par pip.

Pour illustrer, la dernière version de numpydisponible dans PyPI le 01-01-2020 était 1.18.0, tandis que dans le même temps la conda-forgechaîne d'Anaconda n'avait que la version 1.17.3 numpycomme dernière. Ainsi, lorsque vous avez installé un basemappackage avec conda (comme deuxième), votre ancien pip installé numpyserait rétrogradé par conda à 1.17.3, et la version 1.18.0 deviendrait indisponible pour la importfonction. Dans ce cas, ce version()serait bien et pip freeze/ ou conda listmal:

$ 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

1
Pourquoi ne pas utiliser importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc

1
Super trouvaille @sinoroc! Je pense que vous devriez le poster en tant que réponse, et je supprimerai ma réponse un peu trop élaborée :) Exemple de PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd

1
Je vous laisse partir
sinoroc

Vos dernières modifications me surprennent. Pourriez-vous essayer python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc

Celui-ci vous donne la bonne réponse - la dernière version installée (2.3.1), quand version()renvoie toujours la plus ancienne (la plus ancienne) (2.2.3). Vous pouvez répliquer ce résultat en installant les deux versions avec le --usercommutateur, mais en préservant manuellement le lightgbm-2.2.3.dist-infodossier, pour les avoir ensemble, comme indiqué ci-dessus (pip le supprimerait normalement - jusqu'à ce qu'il ne le fasse pas).
mirekphd

1

pip show fonctionne 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:

Ce n'est pas une réponse standard.
hamed baziyad

1

Pour ce faire, en utilisant du code Python:

En utilisant importlib.metadata.version

Python ≥3,8

import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'

Python ≤3,7

(en utilisant importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

En utilisant 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')>

Crédité aux commentaires de sinoroc et mirekphd .


0

Pour Windows, vous pouvez

  1. ouvrez cmd et tapez python, appuyez sur entrée.

  2. tapez l'importation et appuyez sur Entrée.

  3. tapez ._version__ et appuyez sur Entrée.

Comme vous pouvez le voir dans la capture d'écran ici, j'utilise cette méthode pour vérifier la version du module série.

Image



0

En question, il n'est pas mentionné quel utilisateur du système d'exploitation utilise (Windows / Linux / Mac)

Comme il y a quelques réponses qui fonctionneront parfaitement sur Mac et Linux.

La commande ci-dessous peut être utilisée au cas où l'utilisateur essaie de trouver la version d'un package python sur Windows.

Dans PowerShell, utilisez la commande ci-dessous:

pip list | findstr <PackageName>

Exemple:- pip list | findstr requests

Production : requests 2.18.4

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.