Как поднять исключение на номер версии модуля

StackOverflow https://stackoverflow.com/questions/419010

  •  03-07-2019
  •  | 
  •  

Вопрос

Как вы можете вызвать исключение при импорте модуля, который меньше или больше заданного значения для его __version __?

Есть много разных способов сделать это, но я чувствую, что должен быть какой-то действительно простой способ, который ускользает от меня на данный момент. В этом случае номер версии имеет формат x.x.x

Это было полезно?

Решение

Python поставляется с этим встроенным как часть distutils. Модуль называется distutils.version и может сравнивать несколько разных форматов номеров версий.

from distutils.version import StrictVersion

print StrictVersion('1.2.2') > StrictVersion('1.2.1')

Более подробную информацию, чем вам нужно, смотрите в документации:

>>> import distutils.version
>>> help(distutils.version)

Другие советы

Если вы говорите о модулях, установленных с easy_install, то это то, что вам нужно

import pkg_resources
pkg_resources.require("TurboGears>=1.0.5")

это вызовет ошибку, если установленный модуль имеет более низкую версию

Traceback (most recent call last):
  File "tempplg.py", line 2, in <module>
    pkg_resources.require("TurboGears>=1.0.5")
  File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 626, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 528, in resolve
    raise VersionConflict(dist,req) # XXX put more info here
pkg_resources.VersionConflict: (TurboGears 1.0.4.4 (/usr/lib/python2.5/site-packages/TurboGears-1.0.4.4-py2.5.egg), Requirement.parse('TurboGears>=1.0.5'))

Как это?

assert tuple(map(int,module.__version__.split("."))) >= (1,2), "Module not version 1.2.x"

Это многословно, но работает довольно хорошо.

Кроме того, посмотрите pip , который предоставляет более расширенные функциональные возможности.

Вы должны использовать setuptools:

Он позволяет блокировать зависимости приложения, поэтому даже если в системе существует несколько версий яйца или упаковки, будет использоваться только правильная версия.

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

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

Если вы знаете точное форматирование строки версии, сработает простое сравнение:

>>> "1.2.2" > "1.2.1"
True

Это будет работать только в том случае, если каждая часть версии состоит из одной цифры:

>>> "1.2.2" > "1.2.10" # Bug!
True
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top