質問
__ 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を使用する必要があります:
アプリケーションの依存関係をロックできるため、システム上に複数のバージョンのeggまたはパッケージが存在する場合でも、正しいバージョンのみが使用されます。
これはより良い作業方法です。間違ったバージョンの依存関係が存在する場合に失敗するよりも、適切なバージョンが存在することを確認する方が良いです。
Setuptoolsは、アプリケーションの実行に必要なすべてがインストール時に存在することを保証するインストーラーを提供します。また、インポートステートメントを発行したときにPCに存在する可能性のあるパッケージの多くのバージョンのどれをロードするかを選択する手段も提供します。
バージョン文字列の正確なフォーマットがわかっている場合、単純な比較が機能します:
>>> "1.2.2" > "1.2.1"
True
これは、バージョンの各部分が1桁の数字である場合にのみ機能します。
>>> "1.2.2" > "1.2.10" # Bug!
True