web-dev-qa-db-ja.com

実行時のPythonモジュールバージョンの確認

多くのサードパーティPythonモジュールには、モジュールのバージョン情報を保持する属性があります(通常はmodule.VERSION または module.__version__)ただし、そうでないものもあります。

そのようなモジュールの特定の例は、libxsltおよびlibxml2です。

これらのモジュールの正しいバージョンが実行時に使用されていることを確認する必要があります。これを行う方法はありますか?

潜在的な解決策は、実行時にソースを読み込んでハッシュし、それを既知のバージョンのハッシュと比較することですが、それは厄介です。

より良い解決策はありますか?

108
Gruff

私はハッシュを避けます。使用されているlibxsltのバージョンには、使用に影響しない何らかのタイプのパッチが含まれている場合があります。

別の方法として、実行時にチェックしないことをお勧めします(それが厳しい要件であるかどうかはわかりません)。 python外部依存関係のあるもの(サードパーティライブラリ)については、ユーザーがpythonインストールするかどうかを確認するために実行できるスクリプトを記述しますモジュールの適切なバージョンがインストールされます。

定義された「バージョン」属性を持たないモジュールについては、含まれるインターフェース(クラスおよびメソッド)を検査し、期待するインターフェースと一致するかどうかを確認できます。次に、作業している実際のコードで、サードパーティのモジュールに期待どおりのインターフェイスがあると仮定します。

6
Mark Roddy

pkg_resources を使用します。 PyPIからインストールされるものには、少なくともバージョン番号が必要です。

>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
230
EnigmaCurry

いくつかのアイデア:

  1. 必要なバージョンに存在する関数または存在しない関数を確認してください。
  2. 関数に違いがない場合は、関数の引数と署名を調べます。
  3. 関数シグネチャからそれを理解できない場合は、インポート時にいくつかのスタブ呼び出しを設定し、それらの動作を確認してください。
6

使用できます

pip freeze

インストールされたパッケージを要件形式で表示します。

2
nos

これには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メソッドへの引数としてパッケージ名を渡す必要があります(通常は同じですが)。

1
Jakub Kukul

利用可能なさまざまなツール(最高のものを含むpkg_resourcesこの他の回答 )で言及されています。ほとんどのケースがすべてのケースをカバーしているわけではないからです。例えば

  • 組み込みモジュール
  • モジュールはインストールされず、pythonパスに追加されただけです(たとえば、IDEによって))
  • 同じモジュールの2つのバージョンが利用可能(pythonインストールされているものに取って代わるパス)

anyパッケージ、モジュール、またはサブモジュールのバージョンを取得するための信頼できる方法が必要だったため、 getversion と書きました。使い方はとても簡単です:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

詳細については documentation をご覧ください。

0
smarie