Як перевірити версію модулів 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.




12
Для тих, хто цікавиться рішенням командного рядка, використовуйте:pip list
KrisWebDev

Відповіді:


729

Я пропоную використовувати 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


18
відповідь нижче запропонована pip show lxml | grep Version; це запуститься набагато швидше, оскільки він перевіряє лише один пакет.
Джонатан Ванаско

12
Тільки для повноти: Третя версіяpip list | grep lxml
0xAffe

3
Як щодо системи Windows? Що таке grepвікна? З моменту заморозки піп | grep lxml не працює на windwos.
Ворон Чеук

4
Використання @RavenCheukpip list | findstr lxml
Алекс F

2
варіант Windows з find (на 1 символ коротше ...): список піп | знайти "lxml"
Джордан Стефанеллі

368

Ви можете спробувати

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

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

59
На жаль, деякі версії деяких загальних бібліотек (наприклад, inspect) не мають __version__атрибута.
ely

5
PySerial має serial.VERSION. Можливо, є і інші часто використовувані модулі, які не відповідають PEP 0396: python.org/dev/peps/pep-0396
Sussch

6
багато модулів не мають версії
sdaffa23fdsf

1
@ sdaffa23fdsf які модулі не мають версії? Більше ніж serial, inspect, PyQt та SQLite? Дивіться pycmake .
Pål 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__.
імраналь

Як що до цього? construct.version.full_version
MKatleast3

9
Це має бути головна відповідь, це єдиний надійний спосіб отримати версію пакету (якщо така є)
henryJack

7
Зверніть увагу, що pkg_resources.get_distrinbutionне завжди працює також. Він видає певний DistributionNotFoundвиняток із повідомленням про помилку на кшталт: "Розподіл" ім'я_пакуна "не знайдено та вимагається додатком"
mvv

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

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, але вищезгадане буде безпечнішим для будь-яких кращих випадків.
Шість

3
@SamFinnigan pip showбув реалізований у pip 1.2.1.post1 . Ви використовуєте жахливо датовану версію піп, тому не дивно, що у вас виникли проблеми! На даний момент я працюю на pip 7.1.2 . Якщо щось заважає вам оновити, ви завжди можете просто встановити його локально або у virtualenv.
Шість

працював для мене спасибі деякі пакети не мають параметра .__ version__, так що один є більш корисним.
Саліх Карагоз

Здається, я отримую розбіжність у випуску: >> print (sklearn .__ версія__) #returns 0.20.3 >> pip show sklearn #return 0.0; Ви можете уточнити?
Сумант Лазар

76

Кращий спосіб зробити це:


Для детальної інформації про конкретний пакет

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


Здається, я отримую розбіжність у випуску: >> print (sklearn .__ версія__) #returns 0.20.3 >> pip show sklearn #return 0.0; Ви можете уточнити?
Сумант Лазар

1
Ви повинні використовувати pip show scikit-learnзамість pip show sklearn. sklearn - це коротка форма, яка використовується під час імпорту, не розпізнається безпосередньо, pipоскільки scikit-learnповний пакет не навчаєтьсяsklearn
susan097

42

У python3 із дужками навколо друку

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

30
Не кожен пакет має __version__атрибут.
Spedwards

Ця відповідь призначена для python 3 - це інша мова. Однак ви можете використовувати цю відповідь у python 2. Для цього потрібно додати рядок: "from future import print_function" перед іншими операторами.
користувач1976

1
@ user1976 Це дійсний синтаксис і в Python 2. Круглі дужки просто переносяться навколо аргументу до print, як і (2)+(3)оцінки 5. Коли у вас в комах є кома, речі можуть стати дещо цікавішими, хоча printце все ще працює, начебто.
tripleee

22

module.__version__ спершу добре спробувати, але це не завжди працює.

Якщо ви не хочете отримувати оболонки, а ви використовуєте pip 8 або 9, ви все одно pip.get_installed_distributions()можете отримати версії зсередини Python:

оновлення: рішення тут працює в pip 8 та 9, але в pip 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__ 

2
Це просто уникає спроб друку, __version__якщо це не визначено. Якщо немає __version__, ви не отримаєте жодного результату за потрібний пакет.
трійка

Якщо модуль не має __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']

Саме я шукав версію 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__атрибут.
реокс

Я знайшов пакет, який не відображається, pip freezeпроте <package> .__ версія_ працювала. Дякуємо за публікацію
Тімоті К. Квін

6

Якщо припустимо, що ми використовуємо ноутбук Юпітер (якщо ви використовуєте термінал, киньте знаки оклику):

1) якщо пакет (наприклад, xgboost) був встановлений з pip :

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

2) якщо пакет (наприклад, кава) був встановлений із кондицією :

!conda list caffe

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. Наприклад, відкриття терміналу за допомогою python3.8can (безумовно, буде) дає іншу версію бібліотеки, ніж відкриття з python3.5або python2.7.

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


2

Це працює і в Jupyter Notebook для Windows! Поки Jupyter запускається з сумісного з bash командного рядка, такого як Git Bash (MingW64), рішення, наведені в багатьох відповідях, можна використовувати в Jupyter Notebook для систем Windows одним крихітним налаштуванням.

Я запускаю Windows 10 Pro з встановленим через Anaconda програмою Python, і наступний код працює, коли я запускаю 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

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)

Детальну інформацію див. У документації .


1

Щоб отримати список нестандартних (піп) модулів, імпортованих у поточному модулі:

[{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

(Це дає повну інформацію про бібліотеку).



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 [ адресу файлу ], де ви зберігали свій пітон та всі підтримуючі модулі.
  3. використовуйте команду " pip install [назва модуля] " та натисніть клавішу Enter.
  4. Це покаже вам повідомлення як " Вимога вже задоволена: адреса файлу \ ім'я папки (з версією) ".
  5. Дивіться скріншот нижче, наприклад: Я повинен був знати версію попередньо встановленого модуля, який називається "Selenium-Screenshot". Він показав мені правильно як 1.5.0:

скріншот командного рядка


-1

ви можете спочатку встановити такий пакет, а потім перевірити його версію

pip install package
import package
print(package.__version__)

він повинен дати вам пакетну версію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.