Проверка версии модуля Python во время выполнения - PullRequest
105 голосов
/ 02 апреля 2009

Многие сторонние модули Python имеют атрибут, который содержит информацию о версии модуля (обычно что-то вроде module.VERSION или module.__version__), но некоторые нет.

Конкретными примерами таких модулей являются libxslt и libxml2.

Мне нужно проверить, что во время выполнения используется правильная версия этих модулей. Есть ли способ сделать это?

Потенциальным решением было бы прочитать исходный код во время выполнения, хешировать его, а затем сравнить с хешем известной версии, но это противно.

Есть ли лучшие решения?

Ответы [ 5 ]

226 голосов
/ 09 февраля 2011

Использовать pkg_resources . Все, что установлено из PyPI как минимум, должно иметь номер версии.

>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
6 голосов
/ 02 апреля 2009

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

В качестве альтернативы я хотел бы предложить, чтобы вы не проверяли во время выполнения (не знаю, является ли это жестким требованием или нет). Для того, что я пишу на языке Python, который имеет внешние зависимости (сторонние библиотеки), я пишу скрипт, который пользователи могут запустить, чтобы проверить их установку на Python, чтобы увидеть, установлены ли соответствующие версии модулей.

Для модулей, которые не имеют определенного атрибута 'version', вы можете проверить содержащиеся в нем интерфейсы (классы и методы) и посмотреть, соответствуют ли они ожидаемому интерфейсу. Затем в реальном коде, над которым вы работаете, предположим, что сторонние модули имеют ожидаемый интерфейс.

6 голосов
/ 02 апреля 2009

Некоторые идеи:

  1. Попробуйте проверить функции, которые существуют или не существуют в нужных вам версиях.
  2. Если нет различий в функциях, проверьте аргументы функций и подписи.
  3. Если вы не можете понять это по сигнатурам функций, настройте некоторые вызовы-заглушки во время импорта и проверьте их поведение.
2 голосов
/ 23 сентября 2016

Вы можете использовать

pip freeze

для просмотра установленных пакетов в формате требований.

0 голосов
/ 25 февраля 2019

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

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

pip install importlib_metadata

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

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

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

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

...