2011-11-04 5 views
7

私はできるだけ多くのSOページをチェックして、見つけたものすべてを試しましたが、成功したものはありませんでした。私はまた、PEPのページをインポートに関してチェックし、すべての例を試しましたが、どちらもうまくいきませんでした。現在のフォルダの横にあるフォルダからモジュールをインポートするにはどうすればよいですか?

私は単体テストのテストフォルダを持っており、テストしたいモジュールをインポートする必要があります。モジュールはsrcフォルダの隣にある 'src'というフォルダ内にあります。

フォルダ/ファイルは、このような何かを見て:それは、プロジェクトのメインフォルダを含むモジュール作るすべてのフォルダに__init__.pyを追加:

Project/
     src/
      stringbuilder.py 
      __init__.py 
     tests/
      stringbuilder_test.py 
      __init__.py 
     main.py 
     __init__.py 

を私は私ができるすべてを試してみました。

import src.module_to_test 
from ..src.module_to_test import function_to_test 
from ..src import module_to_test 

私はすべてがすべて失敗した他のすべての組み合わせをテストしました。私は自分の設定や理解に何か間違っていなければならないと思っています。これは単純であると思っていました。

明らかな誤りがある場合は、私に知らせてください。

from tests import stringbuilder 

エラーメッセージ:

$ ./stringbuilder_test.py 
Traceback (most recent call last): 
    File "./stringbuilder_test.py", line 14, in <module> 
    from tests import stringbuilder 
ImportError: No module named tests 

同じエラーが発生したため(ただし、テスト= SRC):

from src import stringbuilder 
+0

"src"または "tests"?ファイルとフォルダの階層に関する詳細を教えてください。 – Nicolas

+0

ポストにビットを追加して、階層の表示を試みました。 –

+0

'from tests import stringbuilder' - 上記のツリー構造を見て、なぜ失敗するのかを確認するだけです。 –

答えて

3

スクリプトがパッケージ内から実行される場合、さまざまなハッキングを使用してインポートが適切に機能するようにする必要があります。おそらくこれらの最も一般的なのはsys.pathを操作することである。

import sys, os 

sys.path.insert(0, 
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from src import stringbuilder 

del sys.path[0] 

通常のimport文を使用してこれを達成する方法はありません。

一般に、より良い解決策は、パッケージ内のスクリプトの実行を単純に回避することです。代わりに、すべてのスクリプトの外にのパッケージを含むディレクトリにパッケージを置きます。現在実行中のスクリプトのディレクトリがsys.pathの先頭に自動的に追加されると、スクリプトがどこから実行されても、パッケージを常に直接インポートできることが保証されます。

ので、ディレクトリ構造は次のようになります。

from package.tests import stringbuilder_test 

そしてstringbuilder_test.pyはこのようsrcモジュールをインポートすることができます:

project/
    package/
     __init__.py 
     src/
      __init__.py 
      stringbuilder.py 
     tests/
      __init__.py 
      stringbuilder_test.py 
    main.py 
    test.py 

test.pyスクリプトは、このようにそのテストをインポートすることができます

from package.src import stringbuilder 
-3

は、あなたのPATHにそのフォルダを追加します。

+2

おっと!どのような恐ろしいアイデア。 –

+0

それをPYTHONPATHに追加することはやや恐ろしいことですが、質問のポイントを逃してしまいます。 PATHに追加することは、ほんの少しでも助けにならないでしょう。 – geoffspear

0
from folder import my_module 

folder__init__.pyファイルがある場合。

+0

これは失敗し、フォルダという名前のモジュールがないと言いました。 –

+0

Er、あなたはあなたのフォルダの名前で 'folder'を置き換えることになったと思います! –

+0

同じエラーが発生しました。 :( –

関連する問題