1

バージョン文字列を取得するために、以前に次のことを行いました。

>>> filepath = './somemodule/__init__.py'
>>> name = 'dummy'
>>> module_source = imp.load_source(name, filepath)
>>> module_source.__version__
1.0.0

が Python 3 で非推奨になったときimp(私は 3.7.1 を使用しています) load_source、std ライブラリだけを必要とする適切な代替手段は何でしょうか?

これは私には少し複雑に思えますload_moduleが、実際には非推奨です:

>>> from importlib.machinery import SourceFileLoader
>>> loaded = SourceFileLoader(name, filepath).load_module()
>>> loaded.__version__
1.0.0

編集#1:

これについては、任意の Python ソース ファイルのインポートで説明されています。(Python 3.3+)そしてそこに出てきた解決策の1つは次のとおりです。

>>> loader = importlib.machinery.SourceFileLoader(name, filepath)
>>> mod = types.ModuleType(loader.name)
>>> loader.exec_module(mod)
>>> mod.__version__
1.0.0
4

1 に答える 1

0

モジュールをインポートする「快適な」方法は、 を使用することimportlib.import_module()です。これは、すべての実用的な目的で、importステートメントを使用するのと同じです。ただし、 にない任意のファイルをインポートすることはできないsys.pathため、ユース ケースでは機能しません。

ファイルを直接インポートするために、importlibドキュメントでは次のレシピが提供されています。

import importlib.util
import sys

# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Optional; only necessary if you want to be able to import the module
# by name later.
sys.modules[module_name] = module

最後に、ちょっとしたアドバイス: バージョン文字列を (say) という名前の別のテキスト ファイルに入れ、バージョンを知る必要があるもの__version__.txtからロードすることをお勧めします。__init__.pyそうすれば、バージョン番号を読み取るために Python コードを実行する必要がなくなります。pkgutil.get_data(__package__, '__version__.txt')inを使用してそのようなファイルからデータをロードし、別のモジュールから呼び出すときに適切な値に__init__.py置き換える__package__か、ファイルを直接開くことができます。 get_data()戻りますbytes.decode()戻り値を呼び出して文字列に変換したい場合があります。

(pkgutil.get_data()これは回り道のように思えるかもしれませんが、コードがZIP ファイルからインポートされた場合や、その他の風変わりな方法でインストールされた場合に必要です。コードが名前空間パッケージに含まれている場合、または特に通常とは異なる方法でインストールされたget_data()場合は、 work および returnNoneであるため、そのケースを確認してクラッシュを回避する必要があります。)

于 2018-11-26T14:10:09.857 に答える