1. ホーム
  2. python

[解決済み] Pythonでバージョン番号を比較する方法は?

2022-03-17 12:58:41

質問

卵を含むディレクトリを歩いて、それらの卵を 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ではない . バージョン文字列を比較するエレガントな方法はないでしょうか?

どのように解決するのですか?

使用方法 packaging.version.parse .

>>> from packaging import version
>>> version.parse("2.3.1") < version.parse("10.1.2")
True
>>> version.parse("1.3.a4") < version.parse("10.1.2")
True
>>> isinstance(version.parse("1.3.a4"), version.Version)
True
>>> isinstance(version.parse("1.3.xy123"), version.LegacyVersion)
True
>>> version.Version("1.3.xy123")
Traceback (most recent call last):
...
packaging.version.InvalidVersion: Invalid version: '1.3.xy123'

packaging.version.parse はサードパーティのユーティリティですが セットアップツール (ですから、おそらくすでにインストールされているはずです) また、現在の PEP 440 を返します。 packaging.version.Version は、バージョンが適合している場合は packaging.version.LegacyVersion でない場合。後者は常に有効なバージョンの前にソートされます。

備考 : パッケージは、最近 setuptoolsにベンダリングされました。 .


古くからある、そして 現在では非推奨 というメソッドに遭遇することがあります。 distutils.version しかし、これは文書化されていないものであり、また、古いバージョンである PEP 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 の有効なバージョンを "not strict" と見なし、有効なバージョンとは何かという現代の Python の概念に合致していません。

として distutils.version は文書化されていません。 ここで が該当するdocstringです。