Como verificar a versão dos módulos python?

685

Acabei de instalar os módulos python: constructe statlibcom o setuptoolsseguinte:

# Install setuptools to be able to download the following
sudo apt-get install python-setuptools

# Install statlib for lightweight statistical tools
sudo easy_install statlib

# Install construct for packing/unpacking binary data
sudo easy_install construct

Quero poder (programaticamente) verificar suas versões. Existe um equivalente ao que python --versioneu possa executar na linha de comando?

Minha versão do python é 2.7.3.

tarabyte
fonte
6
possível duplicata de Verificação python versão do módulo em tempo de execução
Ciro Santilli郝海东冠状病六四事件法轮功
12
Para os interessados ​​por uma solução de linha de comando, use:pip list
KrisWebDev 21/12/15

Respostas:

726

Sugiro usar pip no lugar de easy_install . Com o pip, você pode listar todos os pacotes instalados e suas versões com

pip freeze

Na maioria dos sistemas Linux, você pode canalizar isso para grep(ou findstrno Windows) para encontrar a linha do pacote específico em que está interessado:

Linux:
$ pip freeze | grep lxml
lxml==2.3

Windows:
c:\> pip freeze | findstr lxml
lxml==2.3

Para um módulo individual, você pode tentar o __version__atributo , no entanto, existem módulos sem ele:

$ python -c "import requests; print(requests.__version__)"
2.14.2
$ python -c "import lxml; print(lxml.__version__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'

Por fim, como os comandos em sua pergunta são prefixados sudo, parece que você está instalando no ambiente global de python. Recomendamos vivamente que olhe para os gerenciadores de ambiente virtual python , por exemplo virtualenvwrapper

alko
fonte
18
uma resposta abaixo sugerida pip show lxml | grep Version; isso funcionará muito mais rápido, pois inspeciona apenas um único pacote.
Jonathan Vanasco
12
Apenas quanto à completude: A terceira versão épip list | grep lxml
0xAffe
3
Que tal no sistema Windows? O que é o grepWindows? Desde o congelamento do pip | O grep lxml não funciona no windwos.
Raven Cheuk #
4
@RavenCheuk usepip list | findstr lxml
Alex F
2
variante do windows com find (1 caractere mais curto ...): lista de pip | find "lxml"
Jordan Stefanelli
366

Podes tentar

>>> import statlib
>>> print statlib.__version__

>>> import construct
>>> print contruct.__version__
damienfrancois
fonte
59
Infelizmente, algumas versões de algumas bibliotecas comuns (como inspect) não possuem um __version__atributo.
ely
5
PySerial tem serial.VERSION. Talvez há alguns outros módulos comumente utilizados, bem, que não são seguintes PEP 0396: python.org/dev/peps/pep-0396
Sussch
6
um monte de módulos não têm versão
sdaffa23fdsf
1
@ sdaffa23fdsf quais módulos não possuem versão? Mais do que serial, inspecionar, PyQt e SQLite? Veja pycmake .
Pål GD
4
print(contruct.__version__)se estiver usando Python 3. *
jacanterbury 5/11
216

Use o pkg_resourcesmódulo distribuído com a setuptoolsbiblioteca. Observe que a string que você passa para o get_distributionmétodo deve corresponder à entrada PyPI.

>>> import pkg_resources
>>> pkg_resources.get_distribution("construct").version
'2.5.2'

e se você quiser executá-lo na linha de comando, você pode:

python -c "import pkg_resources; print(pkg_resources.get_distribution('construct').version)"

Observe que a string que você passa para o get_distributionmétodo deve ser o nome do pacote, conforme registrado no PyPI, não o nome do módulo que você está tentando importar.

Infelizmente, estes nem sempre são os mesmos (por exemplo, você faz pip install memcached, mas import memcache).

Jakub Kukul
fonte
19
Isso funciona mesmo se o módulo não tem o atributo __version__.
Imranal
E isso? construct.version.full_version
precisa saber é o seguinte
8
Deve ser a resposta de topo, é a única maneira confiável de obter a versão do pacote (se houver)
henryJack
7
Observe que pkg_resources.get_distrinbutionnem sempre funciona também. DistributionNotFoundEmite alguma exceção com a mensagem de erro como: "A distribuição 'the_package_name' não foi encontrada e é exigida pelo aplicativo"
mjv
2
@mjv é provável que seu erro ocorra porque 1) o pacote não está instalado 2) você está passando um nome de módulo em vez de um nome de pacote para o get_distributionmétodo #
Jakub Kukul
96

Eu acho que isso pode ajudar, mas primeiro instale o showpacote para executar pip showe use show para encontrar a versão!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version
0x3bfc
fonte
2
Não há alegria aqui! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan
Esta resposta só é realmente adequada se você precisar de uma versão do pacote do shell. Se você precisar dele dentro do Python, isso seria um hack muito ruim. De qualquer forma, você pode usar o seguinte comando para extrair a versão: pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Provavelmente, você pode se dar bem com um script AWK mais simples, mas o mencionado acima será mais seguro para qualquer caso extremos.
Seis
3
O @SamFinnigan pip showfoi implementado no pip 1.2.1.post1 . Você está usando uma versão terrivelmente datada do pip, portanto, não é de admirar que esteja tendo problemas! Atualmente, estou executando o pip 7.1.2 . Se algo estiver impedindo a atualização, você sempre pode instalá-lo localmente ou em um virtualenv.
6
trabalhou para mim obrigado. algumas das embalagens não possuem o parâmetro .__ version__, de forma que uma seja mais útil.
Salih Karagoz
Parece que estou tendo uma discrepância na saída: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; você pode esclarecer?
Sumanth Lázaro
76

A melhor maneira de fazer isso é:


Para os detalhes de pacote específico

pip show <package_name>

Ele detalha o nome do pacote, versão, autor, local etc.


$ pip show numpy
Name: numpy
Version: 1.13.3
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@python.org
License: BSD
Location: c:\users\prowinjvm\appdata\local\programs\python\python36\lib\site-packages
Requires:

Para mais detalhes: >>> pip help


pip deve ser atualizado para fazer isso.

pip install --upgrade pip

No Windows, o comando recomendado é:

python -m pip install --upgrade pip

susan097
fonte
Parece que estou tendo uma discrepância na saída: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; você pode esclarecer?
Sumanth Lázaro
1
Você deve usar em pip show scikit-learnvez de pip show sklearn. sklearn é curto formulário usado durante a importação, não reconhece diretamente em pipuma vez scikit-learné o pacote completo aprender a nãosklearn
susan097
42

Em python3 com colchetes ao redor da impressão

>>> import celery
>>> print(celery.__version__)
3.1.14
user224767
fonte
30
Nem todo pacote tem um __version__atributo.
Spedwards
Esta resposta é para python 3 - que é uma linguagem diferente. No entanto, você pode usar esta resposta no python 2. Para fazer isso, é necessário adicionar a linha: "from future import print_function", antes das outras instruções.
usar o seguinte comando
1
@ user1976 Também é uma sintaxe válida no Python 2. Os parênteses são simplesmente tolerados em torno do argumento print, assim como o (2)+(3)avalia 5. Quando você tem uma vírgula entre parênteses, as coisas podem ficar um pouco mais interessantes, embora print, ainda funcione, mais ou menos.
Tripleee
22

module.__version__ é uma boa primeira coisa a tentar, mas nem sempre funciona.

Se você não deseja desembolsar e está usando o pip 8 ou 9, ainda pode usar pip.get_installed_distributions()para obter versões no Python:

update: a solução aqui funciona no pip 8 e 9, mas no pip 10 a função foi movida de pip.get_installed_distributionspara pip._internal.utils.misc.get_installed_distributionspara indicar explicitamente que não é para uso externo. Não é uma boa ideia confiar nisso se você estiver usando o pip 10+.

import pip

pip.get_installed_distributions()  # -> [distribute 0.6.16 (...), ...]

[
    pkg.key + ': ' + pkg.version
    for pkg in pip.get_installed_distributions()
    if pkg.key in ['setuptools', 'statlib', 'construct']
] # -> nicely filtered list of ['setuptools: 3.3', ...]
à prova d'água
fonte
1
Sim, nem todos os criadores de pacotes definem a versão , mas se você estiver usando pip, isso sempre funcionará.
waterproof
2
Infelizmente, esta solução não é viável. O Pip não garante nenhuma API em processo, apenas uma API através da linha de comando. Esta abordagem não funciona mais no pip 10.
Jason R. Coombs
16

As respostas anteriores não resolveram meu problema, mas esse código:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 
tashuhka
fonte
2
Isso evita a tentativa de impressão, __version__se não definida. Se não houver __version__, você não receberá resultado para o pacote que deseja.
Tripleee
Se o módulo não possui um __version__atributo, que é o padrão ( python.org/dev/peps/pep-0396/#specification ), é impossível saber onde e como a versão é incluída sem investigação manual.
Tashuhka
12

Você pode usar importlib_metadata biblioteca para isso.

Se você estiver em python <3.8, primeiro instale-o com:

pip install importlib_metadata

Desde python 3.8 ele está incluído na biblioteca padrão.

Em seguida, para verificar a versão de um pacote (neste exemplo lxml), execute:

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

Lembre-se de que isso funciona apenas para pacotes instalados a partir do PyPI. Além disso, você deve passar um nome de pacote como argumento para o versionmétodo, em vez de um nome de módulo que esse pacote fornece (embora eles geralmente sejam os mesmos).

Jakub Kukul
fonte
12

Use dir()para descobrir se o módulo possui algum __version__atributo.

>>> import selenium
>>> dir(selenium)
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', '__path__', '__version__']
>>> selenium.__version__
'3.141.0'
>>> selenium.__path__
['/venv/local/lib/python2.7/site-packages/selenium']
jturi
fonte
Exatamente eu procurei a versão Selenium - e magicamente aqui a temos! Funciona com Python3, então - bom trabalho!
pbaranski 18/09/19
este é o mais próximo de uma solução robusta
D Adams
6

Se os métodos acima não funcionarem, vale a pena tentar o seguinte em python:

import modulename

modulename.version
modulename.version_info

Consulte Obter versão do Tornado Python?

Note, o .versiontrabalhou para mim em alguns outros além do furacão também.

D Adams
fonte
6

primeiro adicione python, pip às suas variáveis ​​de ambiente. para que você possa executar seus comandos no prompt de comando. então simplesmente dê python comando . depois importe o pacote

->import scrapy

depois imprima o nome da versão

->print(scrapy.__version__)

Isso definitivamente funcionará

suraj garla
fonte
2
Como discutido várias vezes aqui, nem todos os módulos fornecem um __version__atributo.
Rex 24/18
Encontrei um pacote que não aparece com o pip freeze<package> .__ version_ funcionado. Obrigado por publicar.
Timothy C. Quinn
6

Supondo que estamos usando o Jupyter Notebook (se estiver usando o Terminal, solte os pontos de exclamação):

1) se o pacote (por exemplo, xgboost) foi instalado com o pip :

!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost

2) se o pacote (por exemplo, caffe) foi instalado com o conda :

!conda list caffe
user10429366
fonte
5

Alguns módulos não têm __version__atributo, portanto, a maneira mais fácil é verificar o terminal:pip list

Yuchao Jiang
fonte
5

Na versão Python 3.8, há um novo metadatamódulo no importlibpacote, que também pode fazer isso.

Aqui está um exemplo dos documentos:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
Davit Tovmasyan
fonte
Este método tem o benefício de funcionar quando o atributo de versão não está definido.
Dereckson
3

Sugiro abrir um pythonshell no terminal (na versão python que você está interessado), importar a biblioteca e obter seu __version__atributo.

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Nota 1: Devemos considerar a versão python . Se instalamos versões diferentes do python, temos que abrir o terminal na versão python em que estamos interessados. Por exemplo, abrir o terminal com python3.8can (certamente fornecerá) fornecer uma versão diferente de uma biblioteca do que abrir com python3.5ou python2.7.

Nota 2: Nós evitar o uso da printfunção , porque o seu comportamento depende python2 ou python3. Não precisamos dele, o terminal mostrará o valor da expressão.

Jesus amado
fonte
2

Isso também funciona no Jupyter Notebook no Windows! Desde que o Jupyter seja iniciado a partir de uma linha de comando compatível com o bash, como Git Bash (MingW64), as soluções fornecidas em muitas das respostas podem ser usadas no Jupyter Notebook nos sistemas Windows com um pequeno ajuste.

Estou executando o Windows 10 Pro com o Python instalado via Anaconda, e o código a seguir funciona quando inicio o Jupyter via Git Bash (mas não quando inicio no prompt do Anaconda).

O ajuste: adicione um ponto de exclamação ( !) na frente pippara torná-lo !pip.

>>>!pip show lxml | grep Version
Version: 4.1.0

>>>!pip freeze | grep lxml
lxml==4.1.0

>>>!pip list | grep lxml
lxml                               4.1.0                  

>>>!pip show lxml
Name: lxml
Version: 4.1.0
Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
Home-page: http://lxml.de/
Author: lxml dev team
Author-email: lxml-dev@lxml.de
License: BSD
Location: c:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions
Karl Baker
fonte
2

Programa python rápido para listar todos os pacotes (você pode copiá-lo para requirements.txt )

from pip._internal.utils.misc import get_installed_distributions
print_log = ''
for module in sorted(get_installed_distributions(), key=lambda x: x.key): 
    print_log +=  module.key + '~=' + module.version  + '\n'
print(print_log)

A saída seria semelhante a:

asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98
Yarh
fonte
2

(consulte também https://stackoverflow.com/a/56912280/7262247 )

Achei bastante confiável usar as várias ferramentas disponíveis (incluindo a melhor pkg_resourcesmencionada pela resposta de Jakub Kukul ), pois a maioria delas não cobre todos os casos . Por exemplo

  • módulos embutidos
  • módulos não instalados, mas adicionados ao caminho do python (por seu IDE, por exemplo)
  • duas versões do mesmo módulo disponíveis (uma no caminho python substituindo a outra instalada)

Como precisávamos de uma maneira confiável de obter a versão de qualquer pacote, módulo ou submódulo, acabei escrevendo o getversion . É bastante simples de usar:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

Veja a documentação para detalhes.

smarie
fonte
1

Para obter uma lista de módulos não padrão (pip) importados no módulo atual:

[{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() 
   if pkg.key in set(sys.modules) & set(globals())]

Resultado:

>>> import sys, pip, nltk, bs4
>>> [{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() if pkg.key in set(sys.modules) & set(globals())]
[{'pip': '9.0.1'}, {'nltk': '3.2.1'}, {'bs4': '0.0.1'}]

Nota:

Esse código foi criado a partir de soluções nesta página e em Como listar módulos importados?

Tobias Bleisch
fonte
1

Em suma:

conda list   

(Ele fornecerá todas as bibliotecas junto com os detalhes da versão).

E:

pip show tensorflow

(Ele fornece detalhes completos da biblioteca).

Tej
fonte
0

Com base na resposta de Jakub Kukul encontrei uma maneira mais confiável de resolver esse problema.

O principal problema dessa abordagem é que requer que os pacotes sejam instalados "convencionalmente" (e isso não inclui o uso de pip install --user ) ou estejam no PATH do sistema na inicialização do Python.

Para contornar isso, você pode usar pkg_resources.find_distributions(path_to_search). Isso basicamente procura por distribuições que seriam importáveis ​​se path_to_searchestivessem no sistema PATH.

Podemos iterar através deste gerador como este:

avail_modules = {}
distros = pkg_resources.find_distributions(path_to_search)
for d in distros:
    avail_modules[d.key] = d.version

Isso retornará um dicionário com módulos como chaves e sua versão como valor. Essa abordagem pode ser estendida para muito mais que o número da versão.

Obrigado a Jakub Kukul por apontar para a direção certa

Alessio Arena
fonte
0

Escrevendo esta resposta para usuários do Windows. Conforme sugerido em todas as outras respostas, você pode usar as instruções como:

import [type the module name]
print(module.__version__)      # module + '.' + double underscore + version + double underscore

Porém, existem alguns módulos que não imprimem sua versão mesmo após o uso do método acima. Então, o que você pode simplesmente fazer é:

  1. Abra o prompt de comando.
  2. Navegue até o endereço / diretório do arquivo usando cd [ endereço do arquivo ] onde você manteve seu python e todos os módulos de suporte instalados.
  3. use o comando " pip install [module name] " e pressione enter.
  4. Isso exibirá uma mensagem como " Requisito já satisfeito: endereço do arquivo \ nome da pasta (com versão) ".
  5. Veja a captura de tela abaixo para ex: eu precisava conhecer a versão de um módulo pré-instalado chamado "Selenium-Screenshot". Ele me mostrou corretamente como 1.5.0:

captura de tela do prompt de comando

lousycoder
fonte
0

Você pode tentar isso:

pip list

Isso produzirá todos os pacotes com suas versões. Resultado

CRBelhekar
fonte
-1

você pode instalar primeiro um pacote como este e depois verificar sua versão

pip install package
import package
print(package.__version__)

deve fornecer a versão do pacote

Shaina Raza
fonte