Как проверить версию модулей 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
ТОЛЬКО, и он работал отлично.