Respostas:
A partir do pip 1.3 , existe um pip show
comando.
$ 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 freeze
e grep
deve fazer o trabalho corretamente.
$ pip freeze | grep Jinja2
Jinja2==2.7.3
save
nome.
pip show pip
para obter as informações da versão do pip, e não pip --version
como eu esperava.
pip freeze
tem a vantagem de mostrar corretamente as versões editáveis do check-out do VCS, enquanto pip show
não.
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
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)
pip list
são genéricos e __version__
não são. Eu também vi version()
e get_version()
para o importado.
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
Você também pode instalar yolk
e executar, o yolk -l
que 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
A maneira mais fácil é esta:
import jinja2
print jinja2.__version__
__version__
em seu código-fonte. Muitos pacotes não.
import
e a saída de pip freeze
.
Há também uma ferramenta chamada pip-check
que fornece uma visão geral rápida de todos os pacotes instalados e seus status de atualização:
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 ...
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_name
parâmetro deve conter o nome do pacote no formato retornado por pip freeze
e não como usado durante import
, por exemplo, scikit-learn
não sklearn
ou Flask-Caching
não flask_caching
.
Observe que, embora invocar pip freeze
na 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 sklearn
vs 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 numpy
disponível no PyPI em 04-01-2020 foi a 1.18.0, enquanto o conda-forge
canal da Anaconda tinha apenas a versão 1.17.3 numpy
como a mais recente. Portanto, quando você instalava um basemap
pacote com o conda (como o segundo), seu pip-instalado anteriormente numpy
seria rebaixado pelo conda para 1.17.3 e a versão 1.18.0 ficaria indisponível para a import
função. Nesse caso, version()
estaria certo e pip freeze
/ conda list
errado:
$ 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()
ainda retorna a mais antiga (2.2.3). Você pode replicar esse resultado instalando as duas versões com a --user
opção, mas preservando manualmente a lightgbm-2.2.3.dist-info
pasta, para reuni-las, conforme listado acima (o pip normalmente o remove - até que não o faça).
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:
Para fazer isso usando o 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')>
Creditado aos comentários de sinoroc e mirekphd .
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
show
comando no pip: github.com/pypa/pip/issues/33