多くのサードパーティPythonモジュールには、モジュールのバージョン情報を保持する属性があります(通常はmodule.VERSION
または module.__version__
)ただし、そうでないものもあります。
そのようなモジュールの特定の例は、libxsltおよびlibxml2です。
これらのモジュールの正しいバージョンが実行時に使用されていることを確認する必要があります。これを行う方法はありますか?
潜在的な解決策は、実行時にソースを読み込んでハッシュし、それを既知のバージョンのハッシュと比較することですが、それは厄介です。
より良い解決策はありますか?
私はハッシュを避けます。使用されているlibxsltのバージョンには、使用に影響しない何らかのタイプのパッチが含まれている場合があります。
別の方法として、実行時にチェックしないことをお勧めします(それが厳しい要件であるかどうかはわかりません)。 python外部依存関係のあるもの(サードパーティライブラリ)については、ユーザーがpythonインストールするかどうかを確認するために実行できるスクリプトを記述しますモジュールの適切なバージョンがインストールされます。
定義された「バージョン」属性を持たないモジュールについては、含まれるインターフェース(クラスおよびメソッド)を検査し、期待するインターフェースと一致するかどうかを確認できます。次に、作業している実際のコードで、サードパーティのモジュールに期待どおりのインターフェイスがあると仮定します。
pkg_resources を使用します。 PyPIからインストールされるものには、少なくともバージョン番号が必要です。
>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
いくつかのアイデア:
使用できます
pip freeze
インストールされたパッケージを要件形式で表示します。
これにはimportlib_metadata
ライブラリを使用できます。
python <3.8
]を使用している場合は、最初に以下を使用してインストールします。
pip install importlib_metadata
python 3.8
]なので、Pythonの標準ライブラリに含まれています。
次に、パッケージのバージョン(この例ではlxml
)を確認するには、次を実行します。
>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'
これはPyPIからインストールされたパッケージに対してのみ機能することに注意してください。また、このパッケージが提供するモジュール名ではなく、version
メソッドへの引数としてパッケージ名を渡す必要があります(通常は同じですが)。
利用可能なさまざまなツール(最高のものを含むpkg_resources
この他の回答 )で言及されています。ほとんどのケースがすべてのケースをカバーしているわけではないからです。例えば
anyパッケージ、モジュール、またはサブモジュールのバージョンを取得するための信頼できる方法が必要だったため、 getversion と書きました。使い方はとても簡単です:
from getversion import get_module_version
import foo
version, details = get_module_version(foo)
詳細については documentation をご覧ください。