1. ホーム
  2. python

[解決済み] imp.load_sourceメソッドの第一引数は何をするのでしょうか?

2022-02-09 17:05:04

質問

今読んでいる本 これ SOの質問で、絶対パスからモジュールをインポートすることについて。回答は、以下のコードを使用することを示唆している。

import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

以下のような構造を持つディレクトリからファイルをインポートしたい(パッケージです)。

__int__.py
model_params.py

こんなことをしました。

import01 = imp.load_source('module.name', '/home/wakatana/experiments/model_params/model_params.py')

これで model_params.py を経由して import01.VARIABLE_NAME . と同等と思われます。 import numpy as np . ここで model_params.py は次のようなものです。 numpyimport01np .

の第1引数は何を意味しているのか、お聞きしたいです。 load_source メソッドは何をするのですか? help(imp) については、実質的に何も言っていません。 load_source メソッドで、例えば次のような help(imp.load_source) を返す load_source(...)

ありがとうございます。

behzad.nouriのコメントに基づいて編集しています。

のドキュメントページで ロードソース とある。

name 引数は、モジュール・オブジェクトの作成またはアクセスに使用されます。

しかし、私がアクセスしようとすると module.name モジュールが定義されていないというエラーが出ます。また、なぜ help どうにかしてインストールできないでしょうか?私はpythonでドキュメントがコード自体の一部であることを期待していたのですが、組み込みではなく、オンラインで持っているのが一般的なのでしょうか?

解決方法は?

その 公式ドキュメント には、もう少し詳しい情報があります。

基本的に、モジュールを読み込んだ名前は、そのモジュールをインポートする他のファイルでも使用されます。たとえ module.name モジュールが Python パスのどこにも存在しない場合、あるモジュールをロードしてその名前を付けると、他のモジュールが通常の import という名前であれば、エラーは発生せず、期待通りに動作します。小さな例で説明するとわかりやすいかもしれません。

/tmp/test/foo.py

value = 1337

/tmp/test/bar.py

from foo.bar import value

def print_val():
    print value

/tmp/test/run.py

import imp
foo = imp.load_source('foo.bar', '/tmp/test/foo.py')

import bar

bar.print_val()

予想通り、次のようになります。 1337 が画面に出力されます。もし、その名前が foo.bar でインポートに失敗していたでしょう。 bar.py そのようなモジュールは実際には存在しないからです。

この方法は、サードパーティーモジュール内のインポートを上書きしてしまうため、実際にはモンキーパッチに使用することができます。