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


118

多くのサードパーティのPythonモジュールは、モジュール(通常のようなもののバージョン情報保持する属性持っているmodule.VERSIONかをmodule.__version__しかし、いくつかはしないでください)。

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

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

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

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

回答:


8

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

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

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


244

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

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

8
また、パッケージ名はPyPIエントリの名前でなければならないことに注意してください。したがって、「pkg_resources.get_distribution( 'MySQLdb')。version」のようなものは機能しませんが、「pkg_resources.get_distribution( 'mysql-python')。version」は機能します。
Rahul、

1
絶対ファイル名で実行している場合、は、類似のファイルpkg_resourcesよりも優先順位が高いため、実際に実行しているバージョンを覆っている別のバージョンを選択する可能性がありますPYTHONPATH
tripleee 14

4
__version__属性の作成方法を知りたい場合:stackoverflow.com/q/17583443/562769
Martin Thoma

pkg_resourcesリンクはエラー404
gerrit

自動処理については、この質問を
gerrit

6

いくつかのアイデア:

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

パッケージはバージョンを指定する必要があります。これらのアイデアは、バージョンをチェックするという通常の(ケースの99%と推定される)簡単なタスクには完全にやりすぎです。
Zelphir Kaltstahl

2

使用できます

pip freeze

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


1

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このパッケージが提供するモジュール名ではなく、メソッドに引数としてパッケージ名を渡す必要があります(通常は同じですが)。


0

利用可能なさまざまなツール(この他の回答でpkg_resources言及されている最良のツールを含む)を使用することは非常に信頼できないことに気付きました。例えば

  • 組み込みモジュール
  • モジュールはインストールされていませんが、Pythonパスに追加されています(たとえば、IDEによって)
  • 利用可能な同じモジュールの2つのバージョン(1つはインストール済みのものよりもpythonパスにある)

我々はのバージョンを取得するために信頼性の高い方法必要なのでどんなパッケージ、モジュールまたはサブモジュールを、私は書いてしまったバージョンの取得を。使い方はとても簡単です:

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

詳細については、ドキュメントを参照してください。


0

__version__以下を提供しないモジュールの場合は醜いですが動作します:

#!/usr/bin/env python3.6
import sys
import os
import subprocess
import re

sp = subprocess.run(["pip3", "show", "numpy"], stdout=subprocess.PIPE)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))

または

#!/usr/bin/env python3.7
import sys
import os
import subprocess
import re

sp = subprocess.run(["pip3", "show", "numpy"], capture_output=True)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.