2016-08-26 4 views
0

私は、他のファイルで定義されているpython関数を呼び出している1つのpythonプログラムをテストしようとしています。例えば、メインプログラムは、aeのサブディレクトリの下に位置autoencoder.pyを呼び出し同じディレクトリにあるモジュールでのImportError

import os 
import shutil 
import ae.autoencoder 
if __name__ == '__main__': 
    main() 

run.pyあります。次のように

autoencoer.pyは

import data.py 
# import data 

しかし、import data.pyまたはimport dataのどちらかは必ず次のエラーメッセージ

python run.py 
Traceback (most recent call last): 
File "run.py", line 3, in <module> 
    import ae.autoencoder 
File "/home/autoencoder/ae/autoencoder.py", line 1, in <module> 
    import data.py 
ImportError: No module named 'data' 

を与えるファイル構造があるさ:(/ホーム/オートエンコーダの作業ですディレクトリ、run.pyがどこにあるか)

enter image description here

+4

「から」を試してください。インポートデータ ' – vaultah

+4

は' import data.py'ではなく単に 'import data'であってはなりません –

+0

' from data import * ' –

答えて

0

モジュールdataを同じフォルダにあるモジュールautoencoderからインポートしても、モジュールが検索されるパスは常に最初に実行されるファイルを含むパスなので、パスはrun.pyですあなたの場合。 autoencoderdataの両方がaeサブディレクトリにあります。あなたがやってrun.pyからautoencoderを輸入し

import ae.autoencoder

をあなたは同じようにdataをインポートすることができます。それbecaseインポートae.dataはまだあなたがaeディレクトリを入力する必要がrun.pyのパスを指します。

いつもフォルダに言及しないようにするには、aeディレクトリをシステムパスに追加することができます。

sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "./ae") 

ですから、run.pyファイルのようになります。

オープンrun.pyは、その後、あなたはまたsysモジュール、そして

をインポートし、すでにインポートされたモジュールosが必要これは:

import os 
import shutil 
import sys 
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "./ae") 
import autoencoder 
def main(): 
    pass 

if __name__ == "__main__": 
    main() 

そして、あなたのautoencoder.pyは次のようになります。

import data 

IDEを使用していて、sys.path.appendメソッドをしようとした場合、モジュールautoencoderdataがIDEによって発見されていないとして、それが表示されることがありますが、実際にはパスが含まれているため実行時に見つかるため、実行する必要があります。


同じディレクトリにモジュールをロードする別の方法がある:あなたが実行時に多くのモジュールまたはインポートモジュールをインポートする必要がある場合には

from . import module_name 

IMPを使用することをお勧めします(現在は非推奨)またはimportlibモジュール。 Pythonの3.5+のために

のPython 3.3と3.4の場合
import importlib.util 
spec = importlib.util.spec_from_file_location("module_name", "/path/to/file") 
foo = importlib.util.module_from_spec(spec) 
spec.loader.exec_module(foo) 
foo.MyClass() 

Pythonの2のために
from importlib.machinery import SourceFileLoader 

foo = SourceFileLoader("module_name", "/path/to/file").load_module() 
foo.MyClass() 

import imp 

foo = imp.load_source('module_name', '/path/to/file') 
foo.MyClass() 
+1

この非常に詳細な回答ありがとうございます。 – user288609

0

まず第一に、物事、.pyを追加する必要はありませんインポート時の拡張子:)それは暗黙のことです。

相対インポート(同じディレクトリ内のモジュールをインポートする)の構文は、Pythonバージョン2と3の間でやや厳しくなりました。設定した方法はPython 2.xでも動作しますが、 Python 3.xを実行しています(python --versionを実行して確認できます)。 Python 3では、相対的なインポートを行うためにドットを明示的に使用する必要があります。

のPython 2相対インポート:

import data 

良いのPython 2.5+相対インポート:

from . import data 

あなたが具体的に使用することに限定されている場合を除きあなたは、あなたが書いた任意のコードの中で第二のバージョンを使用する必要があります古代のPythonのバージョン。

関連する問題