回答:
私はハッシングを避けます。使用されているlibxsltのバージョンには、使用に影響しない何らかのタイプのパッチが含まれている可能性があります。
代わりに、実行時にチェックしないことをお勧めします(これが難しい要件であるかどうかはわかりません)。外部依存関係(サードパーティのライブラリ)を作成するpythonについては、ユーザーがpythonインストールをチェックして適切なバージョンのモジュールがインストールされているかどうかを確認できるスクリプトを作成します。
定義された「バージョン」属性を持たないモジュールについては、モジュールに含まれるインターフェース(クラスとメソッド)を検査して、それらが期待するインターフェースと一致するかどうかを確認できます。次に、作業中の実際のコードで、サードパーティのモジュールに期待どおりのインターフェイスがあると仮定します。
pkg_resourcesを使用します。PyPIからインストールされたものには、少なくともバージョン番号が必要です。
>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
pkg_resources
よりも優先順位が高いため、実際に実行しているバージョンを覆っている別のバージョンを選択する可能性がありますPYTHONPATH
。
__version__
属性の作成方法を知りたい場合:stackoverflow.com/q/17583443/562769
pkg_resources
リンクはエラー404
いくつかのアイデア:
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
言及されている最良のツールを含む)を使用することは非常に信頼できないことに気付きました。例えば
我々はのバージョンを取得するために信頼性の高い方法必要なのでどんなパッケージ、モジュールまたはサブモジュールを、私は書いてしまったバージョンの取得を。使い方はとても簡単です:
from getversion import get_module_version
import foo
version, details = get_module_version(foo)
詳細については、ドキュメントを参照してください。
__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))