2016-12-09 7 views
1

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' 

答えて

2

まず。次に、絶対インポートまたは相対インポートのいずれかでhelloモジュールをインポートする必要があります。

絶対インポート:

from subfolders.folder1.hello import hello_world 

相対インポート:

from .hello import hello_world 

あなたはトップレベルのパッケージでhello.pyを探します現時点でそれを行う方法(あなたのmain.pyは)。そこに見つけることができないので、あなたはエラーを取得します。 python3

における相対的な輸入に

注意あなたがpropably暗黙の相対的な輸入品を使用する際にトラブルに巻き込まれる理由であるのpython3にPython2から切り替えます。 PEP404が言うように: - 唯一絶対の輸入と明示的な相対的な輸入が をサポートしているのPython 3では

、パッケージ内の暗黙の相対的な輸入はもはや利用 ません。また、スターインポート(x import *など)は、モジュールレベルのコードでは しか許可されていません。

あなたのコードはPython2で動作するはずですが、Python3では上記のオプションの1つを使用する必要があります。参考:Changes in import statement python3

1

コードの問題は、サブフォルダはパッケージではなくフォルダであることです。 import_moduleを使用している場合は、パッケージ内でサブパッケージを検索することのみが可能です。

解決方法: .pyをサブフォルダフォルダに作成し、そこにfolder1をインポートします。

関連する問題