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