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

687

Я только что установил модули 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я могу запустить из командной строки?

Мой питон версия 2.7.3.

tarabyte
источник
6
возможный дубликат проверки версии модуля Python во время выполнения
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
Также: stackoverflow.com/questions/3524168/…
user2314737
12
Для тех, кто интересуется решением командной строки, используйте:pip list
KrisWebDev

Ответы:

730

Я предлагаю использовать 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

ALKO
источник
18
предложенный ответ ниже pip show lxml | grep Version; это будет работать намного быстрее, так как он проверяет только один пакет.
Джонатан Ванаско
12
Просто для полноты: третья версияpip list | grep lxml
0xAffe
3
Как насчет системы Windows? Что grepв окнах? С замораживанием пунктов | grep lxml не работает на windwos.
Ворон Чеук
4
@RavenCheuk использоватьpip list | findstr lxml
Alex F
2
вариант windows с find (на 1 символ короче ...): список пунктов | найти "lxml"
Джордан Стефанелли
368

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

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

>>> import construct
>>> print contruct.__version__
damienfrancois
источник
59
Некоторые версии некоторых распространенных библиотек (таких как inspect) не имеют __version__атрибута, к сожалению.
Ely
5
PySerial имеет serial.VERSION. Возможно, есть и другие часто используемые модули, которые не соответствуют PEP 0396: python.org/dev/peps/pep-0396
Sussch
6
много модулей не имеют версии
sdaffa23fdsf
1
@ sdaffa23fdsf, какие модули не имеют версии? Больше чем серийный, проверять, PyQt и SQLite? Смотрите Pycmake .
Пол GD
4
print(contruct.__version__)при использовании Python 3. *
jacanterbury
218

Используйте 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).

Якуб Кукул
источник
20
Это работает, даже если модуль не имеет атрибута __version__.
imranal
Что насчет этого? construct.version.full_version
MKatleast3
9
Должен быть главный ответ, это единственный надежный способ получить версию пакета (если она есть)
henryJack
7
Обратите внимание, что pkg_resources.get_distrinbutionэто не всегда работает. DistributionNotFoundВыдает какое-то исключение с сообщением об ошибке, например: «Распределение the_package_name» не найдено и требуется приложением »
mjv
3
@mjv ваша ошибка, скорее всего, возникает из-за того, что 1) пакет не установлен 2) вы передаете get_distributionметоду имя модуля вместо имени пакета
Jakub
96

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

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version
0x3bfc
источник
2
Нет радости здесь! pip: error: No command by the name pip show (maybe you meant "pip install show")
Сэм Финниган
Этот ответ действительно подходит, только если вам нужна версия пакета из оболочки. Если вам это нужно в Python, это будет довольно плохой взлом. В любом случае, вы можете использовать следующую команду для извлечения версии: pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Вероятно, вы могли бы обойтись без более простого скрипта AWK, но вышеупомянутое будет безопаснее для любых крайних случаев.
6
3
@SamFinnigan pip showбыл реализован в пипе 1.2.1.post1 . Вы используете ужасно устаревшую версию pip, поэтому неудивительно, что у вас возникли проблемы! В настоящее время я использую pip 7.1.2 . Если что-то мешает вам обновить, вы всегда можете просто установить его локально или в virtualenv.
6
сработало для меня спасибо. некоторые из пакетов не имеют параметра .__ version__, так что один из них более полезен.
Салих Карагоз
Кажется, я получаю несоответствие в выводе: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; можешь уточнить?
Сумант Лазарь
77

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


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

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: numpy-discussion@python.org
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

susan097
источник
Кажется, я получаю несоответствие в выводе: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; можешь уточнить?
Сумант Лазарь
1
Вы должны использовать pip show scikit-learnвместо pip show sklearn. sklearn - это краткая форма, используемая при импорте, непосредственно не распознаваемая, pipпоскольку scikit-learnполный пакет не sklearn
изучен
42

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

>>> import celery
>>> print(celery.__version__)
3.1.14
user224767
источник
30
Не у каждой упаковки есть __version__атрибут.
Спедвардс
Этот ответ для Python 3 - это другой язык. Тем не менее, вы можете использовать этот ответ в Python 2. Для этого необходимо добавить строку: «из будущего import print_function», перед другими операторами.
user1976
1
@ user1976 Это правильный синтаксис и в Python 2. Скобки просто допускаются вокруг аргумента to print, как и (2)+(3)оценки для 5. Если в скобках есть запятая, все может стать немного интереснее, хотя printвсе равно работает, вроде.
tripleee
22

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', ...]
водонепроницаемый
источник
1
Да, не все создатели пакетов устанавливают версию , но если вы используете pip, это всегда должно работать.
водонепроницаемый
2
К сожалению, это решение не является жизнеспособным. Pip не гарантирует никакого внутрипроцессного API, только API через командную строку. Этот подход больше не работает на 10-м пункте.
Джейсон Р. Кумбс
16

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

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 
tashuhka
источник
2
Это просто позволяет избежать попыток печати, __version__если он не определен. Если нет __version__, вы не получите результат для пакета, который вы хотите.
tripleee
Если модуль не имеет __version__атрибута, который является стандартным ( python.org/dev/peps/pep-0396/#specification ), невозможно узнать, где и как версия включена без ручного исследования.
ташухка
12

Вы можете использовать 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

Используйте, 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']
jturi
источник
Именно я искал версию Selenium - и волшебным образом у нас это есть! Работает с Python3, так что - хорошая работа!
pbaranski
это самое близкое к надежному решению
D Adams
6

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

import modulename

modulename.version
modulename.version_info

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

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

Д Адамс
источник
6

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

->import scrapy

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

->print(scrapy.__version__)

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

Сурадж Гарла
источник
2
как несколько раз обсуждалось здесь, не каждый модуль предоставляет __version__атрибут.
Reox
Я нашел пакет, который не отображается с тем, как pip freeze<пакет> .__ версия_ работала. Спасибо за публикацию.
Тимоти К. Куинн
6

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

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

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

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

!conda list caffe
user10429366
источник
5

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

Ючао Цзян
источник
5

В версии Python 3.8 metadataв importlibпакете появился новый модуль , который также может это делать.

Вот пример из документации:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
Давид Товмасян
источник
Этот метод имеет преимущество при работе, когда атрибут версии не определен.
Дерексон
3

Я предлагаю открыть pythonоболочку в терминале (в интересующей вас версии python), импортировать библиотеку и получить ее __version__атрибут.

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Примечание 1: мы должны рассмотреть версию Python . Если мы установили разные версии python, мы должны открыть терминал в интересующей нас версии python. Например, открытие терминала с помощью python3.8can (несомненно, даст) даст другую версию библиотеки, чем открытие с помощью python3.5или python2.7.

Примечание 2: мы избегаем использования printфункции , потому что ее поведение зависит от python2 или python3. Нам это не нужно, терминал покажет значение выражения.

loved.by.Jesus
источник
2

Это работает и в 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: lxml-dev@lxml.de
License: BSD
Location: c:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions
Карл Бейкер
источник
2

Быстрая программа питон , чтобы перечислить все packges (вы можете скопировать его в 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)

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

asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98
Yarh
источник
2

(см. также https://stackoverflow.com/a/56912280/7262247 )

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

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

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

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

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

smarie
источник
1

Чтобы получить список нестандартных (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'}]

Замечания:

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

Тобиас Блейш
источник
1

В итоге:

conda list   

(Он предоставит все библиотеки вместе с информацией о версии).

А также:

pip show tensorflow

(Это дает полную информацию о библиотеке).

Тедж
источник
1

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

pip list

Это выведет все пакеты с их версиями. Вывод

CRBelhekar
источник
0

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

Основная проблема этого подхода заключается в том, что пакеты должны быть установлены «условно» (и это не включает использование 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

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

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

Алессио Арена
источник
0

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

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

Но есть некоторые модули, которые не печатают свою версию даже после использования описанного выше метода. Итак, что вы можете просто сделать:

  1. Откройте командную строку.
  2. Перейдите к адресу / каталогу файла, используя cd [ file address ], где вы сохранили свой python и все поддерживающие модули.
  3. используйте команду " pip install [имя модуля] " и нажмите ввод.
  4. Это покажет вам сообщение « Требование уже выполнено: адрес файла \ имя папки (с версией) ».
  5. Смотрите скриншот ниже для примера: мне нужно было знать версию предустановленного модуля с именем «Selenium-Screenshot». Он показал мне правильно, как 1.5.0:

скриншот командной строки

lousycoder
источник
-1

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

pip install package
import package
print(package.__version__)

это должно дать вам версию пакета

Shaina Raza
источник