2012-01-10 4 views
3

私のディレクトリ構造を抱えている問題をインポートするには、私がdomain.entities import MyCLassPythonは私が

から両方のテストとドメインのdirのは__init__.py年代を持っているtest.ptでこの

main/src/domain/entities.py 
-entities.py has some classes 
main/tests/test.py 

のようなものです。

私がしたいモジュールが見つかりません。 私はtest.pyをpython3 test.pyで実行します。

なぜでしょうか?

+0

あなたにも声明をインポートするために使用しているコードを投稿してください。 – Makoto

+0

私はdomains.entities import MyClassから使用していますが、すべてのバリエーションを試しました –

答えて

3

はsys.pathのmain/srcですか? Pythonは、sys.path内のディレクトリを検索してモジュール名を解決します。たとえば、 "import ../module.py"は無効です。あなたはまた、メイン/ SRC /ドメインはのinitの.pyが含まれていることを確認する必要があります

import sys, os 

sys.path.insert(0, os.path.abspath("../src")) 

# Then try 
from domain.entries import MyClass 

:あなたの「メイン/テスト/ test.py」ファイルに追加します。あなたの問題を解決するには、このような何かを行いますファイル。 また、パスに親ディレクトリを追加してtests.somethingをインポートしない限り、 .pyをメイン/テストで使用する必要はありません。

これが役に立ちます。

+0

私が書いたことからは分かりませんが、基本的には "some_module"をインポートするために、ディレクトリ "some_module"を含むディレクトリはsys.path 「some_module」自体ではありません。 –

+0

返信ありがとうございます。sys.path.insert()のほかにもっと簡単で洗練された方法がありますか? –

+0

これは、Pythonで慣れるために必要なものです。いくつか注意しておきたいのは、ディレクトリsrcからのunix上で 'export PYTHONPATH =' pwd'のようなものを試してみると、PYTHONPATHという環境変数があります。通常、これをvars.shファイルに入れてソースします。しかし、それはどちらも完璧ではありません。現在のモジュールの子をインポートする場合、そのコードをtests/utils.pyに入れて、#!の後にテストファイルの最初の行にimport utilsを置くことができれば、上のトリックは必要ないことに注意してください。コースのライン。 –

1

あなたはそれがのsys.pathを利用するはるかに簡単

main/__init__.py 
main/src/__init__.py 
main/src/domain/__init__.py 
main/src/domain/entities.py 
main/tests/__init__.py 
+0

私はすべての単一のdirで1つでそれを試しても、まだ動作していません –

0

パッケージ内のすべてのディレクトリに__ini__.pyが必要ですが、あなたはここで、その後、グローバルをいじって、それを必要としないソリューションをしたい場合です。

  1. インポートするモジュールと同じフォルダに__init__.pyファイルを含めます。
  2. インポートあなたは、次の構文を使用したいファイルから必要な特定のモジュール:私はさっき、この特定のメソッドをテストしfrom path.to.file.filename import MyClass

。私のフォルダ階層は、main.pyと2つのネストされたフォルダdomains/entitiesを持つものでした。 最上位レベル(つまり、main.pyが存在するレベル)を除く各フォルダには、__init__.pyファイルがあります。

イラスト:

  • main.py
  • project/
    • __init__.py
    • domains/
      • __init__.py
      • entities/
        • __init__.py
        • module1.py