importlibからimport_moduleを使用してモジュールをインポートしたいとします。私がそうすると、自分のモジュールから参照しているファイルが見つかりません。 Pythonシェル(main.pyを使用していない)からモジュールをインポートすると、期待通りに動作します。また、sys.pathにMyModule.pyのパスを追加すると動作しますが、私が理解しているところからは、そうしないと思っています(以下のコードでコメントアウトしています)。import_moduleで読み込んだモジュールからのPythonファイルの参照
モジュールがimport_moduleによって読み込まれたときに、参照ファイルを読み込む方法を教えてください。
私は、次のファイル構造hello.py
MyModule.py
#This is the solution that works but feels wrong
#import os, sys
#sys.path.append(os.path.dirname(__file__))
from hello import hello_world
class MyModule(object):
def __init__(self):
print("Init MyModule")
def module_hello(self):
hello_world()
内容のmain.py
from importlib import import_module
modulename = 'subfolders.folder1.MyModule'
print("Import module ", modulename)
module = import_module(modulename)
m_instance = module.MyModule()
m_instance.module_hello()
内容の
main.py
subfolders
folder1
__init__.py
MyModule.py
hello.py
内容を持っています
def hello_world():
print("Hello World!")
私はこれを実行すると、私が手に:あなたはそこに空__init__.py
を置くことによって、あなたのsubfolders
ディレクトリのパッケージを作成する必要があり
c:\git\PythonImportTest>python main.py
Import module subfolders.folder1.MyModule
Traceback (most recent call last):
File "main.py", line 5, in <module>
module = import_module(modulename)
File "C:\Miniconda3\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "c:\git\PythonImportTest\subfolders\folder1\MyModule.py", line 5, in <module>
from hello import hello_world
ImportError: No module named 'hello'