私は、egg を含むディレクトリをウォークして、それらの egg を に追加していますsys.path
。ディレクトリ内に同じ .egg の 2 つのバージョンがある場合は、最新のものだけを追加したいと思います。
r"^(?P<eggName>\w+)-(?P<eggVersion>[\d\.]+)-.+\.egg$
ファイル名から名前とバージョンを抽出する正規表現があります。問題は、次のような文字列であるバージョン番号を比較することです2.3.1
。
文字列を比較しているので、2 は 10 より上になりますが、これはバージョンとしては正しくありません。
>>> "2.3.1" > "10.1.1"
True
分割、解析、intへのキャストなどを行って、最終的には回避策を見つけることができました。しかし、これはPythonです。Javaではないバージョン文字列を比較するエレガントな方法はありますか?
ベストアンサー1
使用packaging.version.Version
サポートするペップ440バージョン文字列のスタイルの順序付け。
>>> # pip install packaging
>>> from packaging.version import Version
>>> Version("2.3.1") < Version("10.1.2")
True
>>> Version("1.3.a4") < Version("10.1.2")
True
古代の現在は廃止されていますあなたが遭遇する可能性のある方法はdistutils.version
、それは文書化されておらず、置き換えられたペップ386;
>>> from distutils.version import LooseVersion, StrictVersion
>>> LooseVersion("2.3.1") < LooseVersion("10.1.2")
True
>>> StrictVersion("2.3.1") < StrictVersion("10.1.2")
True
>>> StrictVersion("1.3.a4")
Traceback (most recent call last):
...
ValueError: invalid version number '1.3.a4'
ご覧のとおり、有効な PEP 440 バージョンは「厳密ではない」と見なされるため、最新の Python の有効なバージョンの概念と一致しません。
文書化されていないがdistutils.version
、ここ関連するドキュメント文字列です。