Как проверить версию модулей python?

Я только что установил модули python: construct и statlib с помощью setuptools следующим образом:

# 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

Я хочу иметь возможность (программно) проверять их версии. Есть ли эквивалент python --version, который я могу запустить из командной строки?

Моя версия python 2.7.3.

Ответ 1

Я предлагаю использовать pip вместо easy_install. С помощью pip вы можете получить список всех установленных пакетов и их версий:

pip freeze

В большинстве систем linux вы можете передать это grep (или findstr в Windows), чтобы найти строку для конкретного пакета, который вас интересует:

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

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

Для отдельного модуля вы можете попробовать атрибут __version__, однако есть модули без него:

$ 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__'

Наконец, поскольку команды в вашем вопросе имеют префикс sudo, похоже, вы устанавливаете их в глобальную среду Python. Настоятельно советуем взглянуть на менеджеров виртуальной среды python, например virtualenvwrapper

Ответ 2

Вы можете попробовать

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

>>> import construct
>>> print contruct.__version__

Ответ 3

Используйте модуль pkg_resources распространяемый вместе с библиотекой setuptools. Обратите внимание, что строка, которую вы передаете методу get_distribution должна соответствовать записи PyPI.

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

и если вы хотите запустить его из командной строки, вы можете сделать:

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

Обратите внимание, что строка, которую вы передаете методу get_distribution должна быть именем пакета, зарегистрированным в PyPI, а не именем модуля, который вы пытаетесь импортировать.

К сожалению, они не всегда одинаковы (например, вы выполняете pip install memcached, но import memcache).

Ответ 4

Я думаю, что это может помочь, но сначала установить пакет show для запуска pip show, а затем использовать show для поиска версии!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version

Ответ 5

Лучший способ сделать это:


Для деталей конкретного пакета

pip show <package_name>

Это детализирует имя_пакета, версию, автора, местоположение и т.д.


$ 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: [email protected]
License: BSD
Location: c:\users\prowinjvm\appdata\local\programs\python\python36\lib\site-packages
Requires:

Для более подробной информации: >>> pip help


pip должен быть обновлен, чтобы сделать это.
pip install --upgrade pip

В Windows рекомендуем команду:

python -m pip install --upgrade pip

Ответ 6

В python3 с скобками вокруг печати

>>> import celery
>>> print(celery.__version__)
3.1.14

Ответ 7

module.__version__ - это хорошее первое, что нужно попробовать, но это не всегда работает.

Если вы не хотите использовать оболочку и используете pip 8 или 9, вы все равно можете использовать pip.get_installed_distributions() для получения версий из Python:

обновление: решение здесь работает в пипсах 8 и 9, но в пипсе 10 функция была перемещена из pip.get_installed_distributions в pip._internal.utils.misc.get_installed_distributions чтобы явно указать, что она не для внешнего использования. Не стоит полагаться на это, если вы используете 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', ...]

Ответ 8

Предыдущие ответы не помогли решить мою проблему, но этот код сделал:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 

Ответ 9

Вы можете использовать эту команду в командной строке

pip show Modulename

pip show xlrd: pip show xlrd

вы получите вывод, как это со всеми деталями.

Name: xlrd
Version: 1.2.0
Summary: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files
Home-page: http://www.python-excel.org/
Author: John Machin
Author-email: [email protected]
License: BSD
Location: c:\users\rohit.chaurasiya\appdata\local\programs\python\python37\lib\site-packages
Requires:
Required-by:

Ответ 10

Используйте dir() чтобы узнать, есть ли у модуля атрибут __version__.

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

Ответ 11

Для этого вы можете использовать библиотеку importlib_metadata.

Если вы используете Python <3.8, сначала установите его с помощью:

pip install importlib_metadata

Начиная с python 3.8 он включен в стандартную библиотеку.

Затем, чтобы проверить версию пакета (в этом примере lxml), запустите:

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

Имейте в виду, что это работает только для пакетов, установленных из PyPI. Кроме того, вы должны передать имя пакета в качестве аргумента методу version, а не имя модуля, которое предоставляет этот пакет (хотя обычно они совпадают).

Ответ 12

Если вышеуказанные методы не работают, стоит попробовать следующее в python:

import modulename

modulename.version
modulename.version_info

Смотрите Получить версию Porn Tornado?

Обратите внимание, что .version работал у меня на нескольких других, кроме торнадо.

Ответ 13

сначала добавьте python, pip в переменные окружения. так что вы можете выполнять свои команды из командной строки. затем просто дайте команду Python. затем импортируйте пакет

import scrapy

затем напечатайте название версии

print(scrapy.__version__)

Это определенно будет работать

Ответ 14

Некоторые модули не имеют атрибута __version__, поэтому самый простой способ - проверить терминал: pip list

Ответ 15

Когда вы устанавливаете Python, вы также получаете менеджер пакетов Python, pip. Вы можете использовать pip для получения версий модулей Python. Если вы хотите получить список всех установленных модулей Python с их номерами версий, используйте следующую команду:

$ pip freeze

Вы получите вывод:

asn1crypto==0.22.0
astroid==1.5.2
attrs==16.3.0
Automat==0.5.0
backports.functools-lru-cache==1.3
cffi==1.10.0
...

Чтобы по отдельности найти номер версии, вы можете использовать grep для этого вывода на машинах * NIX. Например:

$ pip freeze | grep PyMySQL

PyMySQL == 0.7.11 В Windows вы можете использовать findstr вместо grep. Например:

PS C:\> pip freeze | findstr PyMySql

PyMySQL == 0.7.11

Если вы хотите узнать версию модуля в скрипте Python, вы можете использовать атрибут __version__ модуля, чтобы получить его. Обратите внимание, что не все модули поставляются с атрибутом __version__. Например,

>>> import pylint
>>> pylint.__version__
'1.7.1'

Ответ 16

Предполагая, что мы используем Jupyter Notebook (если вы используете терминал, отбросьте восклицательные знаки):

1) если пакет (например, xgboost) был установлен с помощью pip:

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

2) если пакет (например, caffe) был установлен с помощью conda:

!conda list caffe

Ответ 17

Это работает и в Jupyter Notebook на Windows! Пока Jupyter запускается из командной строки, совместимой с bash, такой как Git Bash (MingW64), решения, приведенные во многих ответах, могут использоваться в Jupyter Notebook в системах Windows с одним небольшим изменением.

Я использую Windows 10 Pro с Python, установленным через Anaconda, и следующий код работает, когда я запускаю Jupyter через Git Bash (но не при запуске из приглашения Anaconda).

Подстройка: добавьте восклицательный знак (!) Перед pip чтобы сделать это !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: [email protected]
License: BSD
Location: c:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions

Ответ 18

Чтобы получить список нестандартных (pip) модулей, импортированных в текущий модуль:

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

Результат:

>>> 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'}]

Примечание:

Этот код был составлен из решений как на этой странице, так и из Как отобразить импортированные модули?

Ответ 19

Быстрая программа на python для вывода списка всех пакетов (вы можете скопировать его в файл require.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)

Вывод будет выглядеть так:

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

Ответ 20

(см. также fooobar.com/questions/1836367/...)

Я нашел довольно ненадежным использование различных доступных инструментов (включая лучший pkg_resources упомянутый в pkg_resources Якуба Кукула), так как большинство из них не охватывает все случаи. Например

  • встроенные модули
  • модули не установлены, а просто добавлены в путь к Python (например, вашей IDE)
  • доступны две версии одного и того же модуля (одна в пути Python заменяет установленную)

Так как нам нужен был надежный способ получить версию любого пакета, модуля или субмодуля, я закончил писать getversion. Это довольно просто использовать:

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

Смотрите документацию для деталей.

Ответ 21

Найдите локальную директорию установки (в большинстве случаев это пакеты сайтов), и автору следовало бы оставить там информацию, которую легко найти.

Ответ 22

Опираясь на ответ Якуба Кукула, я нашел более надежный способ решения этой проблемы.

Основная проблема этого подхода заключается в том, что пакеты должны быть установлены "условно" (и это не включает использование pip install --user) или находиться в системном PATH при инициализации Python.

Чтобы обойти это, вы можете использовать pkg_resources.find_distributions(path_to_search). В основном это поиск дистрибутивов, которые были бы импортированы, если бы path_to_search был в системном PATH.

Мы можем перебрать этот генератор так:

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

Это вернет словарь с модулями в качестве ключей и их версией в качестве значения. Этот подход может быть расширен гораздо больше, чем номер версии.

Спасибо Якубу Кукулу за указание в правильном направлении

Ответ 23

pip freeze

Это самый простой способ найти все версии пакета.

Ответ 24

У меня была та же проблема, я пытался удалить оба модуля: serial и pyserial. Затем я переустановил pyserial ТОЛЬКО, и он работал отлично.