Encontre qual versão do pacote está instalada com o pip

709

Usando o pip, é possível descobrir qual versão de um pacote está atualmente instalada?

Eu sei, pip install XYZ --upgrademas estou me perguntando se existe algo parecido pip info XYZ. Caso contrário, qual seria a melhor maneira de saber qual versão estou usando atualmente.

Alexis
fonte
4
há uma proposta de showcomando no pip: github.com/pypa/pip/issues/33
Hugo Tavares

Respostas:

1013

A partir do pip 1.3 , existe um pip showcomando.

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

Nas versões mais antigas, pip freezee grepdeve fazer o trabalho corretamente.

$ pip freeze | grep Jinja2
Jinja2==2.7.3
AdamKG
fonte
8
@ techechik: É para congelar os módulos atuais para um requirements.txt.
1513 Hugo Hugo
@ Hugo: Eu usaria o savenome.
Anatoly techtonik
5
A denominação de 'congelar' é histórica - remonta a pelo menos 2008 . Na época, muitas pessoas já estavam familiarizadas com o "congelamento" de gemas de rubi, então pip emprestou o nome então amplamente usado.
21414 AdamKG
2
isso não era óbvio nem documentado, mas você pode digitar pip show pippara obter as informações da versão do pip, e não pip --versioncomo eu esperava.
Marc Maxmeister
pip freezetem a vantagem de mostrar corretamente as versões editáveis ​​do check-out do VCS, enquanto pip shownão.
Spookylukey
63

Acabei de enviar uma solicitação pull no pip com o aprimoramento Hugo Tavares disse:

(specloud como exemplo)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
BernardoBarreto
fonte
2
Parece que já está mesclado .
anatoly techtonik
43

O Pip 1.3 agora também possui um comando list :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
RickyA
fonte
Digamos que o nome do pacote seja X. Para encontrar a versão - Qual é a diferença entre usar a lista pip e importar X e depois X .__ version__? As duas versões do pacote são?
variável
ambos são válidos, mas pip listsão genéricos e __version__não são. Eu também vi version()e get_version()para o importado.
RickyA
35

e com - outdated como argumento extra, você obterá as versões Atual e Mais Recente dos pacotes que você está 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)

Então, combinando com a resposta de AdamKG:

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

Verifique também o pip-tools : https://github.com/nvie/pip-tools

KevinS
fonte
1
Uma opção interessante. Eu prefiro que ele liste todos eles, e deixe-me saber se algum deles está desatualizado.
ArtOfWarfare 13/08
17

Você também pode instalar yolke executar, o yolk -lque também fornece uma saída agradável. Aqui está o que eu ganho pelo meu pequeno 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
fonte
9

Você pode usar o comando grep para descobrir.

pip show <package_name>|grep Version

Exemplo:

pip show urllib3|grep Version

mostrará apenas as versões.

Metadados-Versão: 2.0
Versão: 1.12

Rajiv
fonte
8

A maneira mais fácil é esta:

import jinja2
print jinja2.__version__
user5730083
fonte
7
Isso funciona apenas para pacotes que foram definidos __version__em seu código-fonte. Muitos pacotes não.
Spookylukey
É uma boa prática incluir esta versão durante o empacotamento ou é uma boa prática ter apenas a versão no parâmetro de versão do arquivo setup.py?
variável
Esse método também não é robusto para inconsistências de nomes de pacotes (existem pelo menos três tipos) entre a entrada esperada importe a saída de pip freeze.
mirekphd
6

Há também uma ferramenta chamada pip-checkque fornece uma visão geral rápida de todos os pacotes instalados e seus status de atualização:

insira a descrição da imagem aqui

Eu não o usei; apenas tropeçou nele e esta questão SO em rápida sucessão, e desde que não foi mencionado ...

Ola Tuvesson
fonte
Como executar isso no Windows
vela
1
@vela Espero que funcione exatamente da mesma forma no Windows. Claro que você teria que instalá-lo primeiro, como faria em qualquer sistema.
Ola Tuvesson 6/09/19
5

No Windows, você pode emitir comandos como:

pip show setuptools | findstr "Version"

Resultado:

Version: 34.1.1
Quinn
fonte
2

A função python retornando apenas a versão do pacote em um formato legível por máquina:

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

Antes do python 3.8:

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

O equivalente do bash (aqui também chamado de python) seria muito mais complexo (mas mais robusto - veja o cuidado abaixo):

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 da amostra:

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

print(get_installed_ver(pkg_name))
>>> 0.22

Observe que, nos dois casos, o pkg_nameparâmetro deve conter o nome do pacote no formato retornado por pip freezee não como usado durante import, por exemplo, scikit-learnnão sklearnou Flask-Cachingnão flask_caching.

Observe que, embora invocar pip freezena versão bash possa parecer ineficiente, apenas esse método se mostra suficientemente robusto para empacotar peculiaridades e inconsistências de nomes de pacotes (por exemplo, sublinhados x traços, maiúsculas x maiúsculas grandes e abreviações como sklearnvs scikit-learn).

Cuidado: em ambientes complexos, ambas as variantes podem retornar números de versão surpresa, inconsistentes com o que você realmente pode obter durante import.

Um desses problemas surge quando há outras versões do pacote ocultas em uma subpasta de usuário site-packages . Como ilustração dos perigos do uso, version()aqui está uma situação que encontrei:

$ 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

Outro problema é ter alguns pacotes instalados pelo conda no mesmo ambiente. Se eles compartilharem dependências com seus pacotes instalados pelo pip e as versões dessas dependências diferirem, você poderá obter atualizações das dependências instaladas pelo pip.

Para ilustrar, a versão mais recente numpydisponível no PyPI em 04-01-2020 foi a 1.18.0, enquanto o conda-forgecanal da Anaconda tinha apenas a versão 1.17.3 numpycomo a mais recente. Portanto, quando você instalava um basemappacote com o conda (como o segundo), seu pip-instalado anteriormente numpyseria rebaixado pelo conda para 1.17.3 e a versão 1.18.0 ficaria indisponível para a importfunção. Nesse caso, version()estaria certo e pip freeze/ conda listerrado:

$ 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
fonte
1
Por que não usar importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc 30/12/19
1
Ótimo encontrar @sinoroc! Eu acho que você deve publicá-lo como resposta, e eu from importlib_metadata import version; version('Flask-Caching')
excluirei o
1
Eu vou deixar você ir para ele
sinoroc
Suas edições mais recentes me surpreendem. Você poderia tentar python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc 5/01
Essa fornece a resposta correta - a versão mais recente instalada (2.3.1), quando version()ainda retorna a mais antiga (2.2.3). Você pode replicar esse resultado instalando as duas versões com a --useropção, mas preservando manualmente a lightgbm-2.2.3.dist-infopasta, para reuni-las, conforme listado acima (o pip normalmente o remove - até que não o faça).
mirekphd 6/01
1

O pip show funciona em 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:
Superstone
fonte
Não é uma resposta padrão.
hamed baziyad
1

Para fazer isso usando o código Python:

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

Usando 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')>

Creditado aos comentários de sinoroc e mirekphd .

Acumenus
fonte
0

Para Windows, você pode

  1. abra cmd e digite python, pressione enter.

  2. digite a importação e pressione enter.

  3. digite ._version__ e pressione enter.

Como você pode ver na captura de tela aqui, estou usando este método para verificar a versão do módulo serial.

Imagem


joker2368
fonte
0

Em questão, não é mencionado qual usuário do SO está usando (Windows / Linux / Mac)

Como existem algumas respostas que funcionarão perfeitamente no Mac e Linux.

O comando abaixo pode ser usado caso o usuário esteja tentando encontrar a versão de um pacote python no Windows.

No PowerShell, use o comando abaixo:

pip list | findstr <PackageName>

Exemplo:- pip list | findstr requests

Resultado : requests 2.18.4

Ashwani Singh
fonte