[解決済み] Pythonでバージョン番号を比較する方法は?
質問
卵を含むディレクトリを歩いて、それらの卵を
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です。
関連
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] スクリプトを実行しているPythonのバージョンを確認するにはどうしたらいいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python 入出力と高次代入の基礎知識
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)