1. ホーム
  2. python

[解決済み] 任意のPythonソースファイルをインポートする。(Python 3.3+)

2023-05-18 07:53:21

質問

任意の Python ソースファイル (ファイル名は任意の文字を含むことができ、また、常に .py で終わるとは限りません)を Python 3.3+ ?

私が使用したのは imp.load_module を次のようにします。

>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
...     mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>

Python 3.3ではまだ動作していますが、以下のように imp.load_module のドキュメントによると、これは非推奨です。

バージョン 3.3 以降、非推奨 : モジュールをロードするためにローダーを使用する必要があるため、不要です。 を使うべきであり、 find_module() は非推奨です。

imp モジュールのドキュメントでは importlib :

ノート 新しいプログラムでは、このモジュールではなくimportlibを使用する必要があります。

Python 3.3+ で任意の Python ソースファイルをロードするために、非推奨の imp.load_module 関数を使わずに、Python 3.3+ で任意の Python ソースファイルを読み込む正しい方法は何ですか?

どのように解決するのですか?

以下のサイトから解決策を見つけました。 importlib テストコード .

使用方法 importlib.machinery.SourceFileLoaderを使用します。 :

>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = loader.load_module()
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>

注意 でしか動作しません。 Python 3.3+ .

アップデイト Loader.load_module は Python 3.4 以降では非推奨です。使用方法 Loader.exec_module を使用します。

>>> import types
>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = types.ModuleType(loader.name)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b'>


>>> import importlib.machinery
>>> import importlib.util
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> spec = importlib.util.spec_from_loader(loader.name, loader)
>>> mod = importlib.util.module_from_spec(spec)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>