2012-01-10 62 views
3

我的目錄結構是這樣的Python的進口問題,我有

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

我從domain.entities import MyCLass

兩個測試和域目錄的有有__init__.py的。

雖然沒有找到我想要的模塊。 我運行test.py與python3 test.py

任何想法爲什麼?

+0

後您使用的是進口的聲明以及代碼。 – Makoto 2012-01-10 02:24:35

+0

我正在使用domains.entities導入MyClass,但嘗試過所有變種 – 2012-01-10 02:40:30

回答

3

是sys.path中的main/src嗎? Python通過搜索sys.path中的目錄來解析模塊名稱。例如「import ../module.py」無效。要解決你的問題做這樣的事情:在你的「主/測試/ test.py」文件中加入:

import sys, os 

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

# Then try 
from domain.entries import MyClass 

您還需要確保主/ src目錄/域包含INIT的.py文件。 你也不需要init .py在main/tests中,除非你要將它的父目錄添加到你的路徑並導入tests.something。

希望這會有所幫助。

+0

從我寫的內容不清楚,但基本上爲了導入「some_module」,包含目錄「some_module」的目錄需要在sys.path中,而不是「some_module」本身。 – 2012-01-10 02:35:20

+0

感謝您的回覆,除了sys.path.insert()之外,還有更簡單更優雅的方法嗎? – 2012-01-10 02:39:54

+0

這只是你需要習慣於python的東西。需要注意的是,如果你在目錄src的unix上嘗試類似'export PYTHONPATH ='pwd''的東西,那麼你可以設置一個名爲PYTHONPATH的環境變量。我通常會將它放在一個vars.sh文件中,然後將其源代碼。但那也不完美。請注意,如果您導入當前模塊的子項,則上述技巧不是必需的,因此您可能希望將該代碼放入tests/utils.py,然後將導入實用程序作爲任何測試文件的第一行,放在#!之後。當然線。 – 2012-01-10 02:48:53

1

您需要__ini__.py在每個目錄包

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

我在每個目錄中都嘗試過它,但仍無法正常工作 – 2012-01-10 02:43:38

0

這是容易得多利用的sys.path內,但如果你想不涉及與全局搞亂,然後在這裏它的解決方案是。

  1. __init__.py文件包含在與要導入的模塊相同的文件夾中。
  2. 導入你的文件要你想使用下面的語法特定模塊:from path.to.file.filename import MyClass

我測試過這種特殊的方法片刻之前。我的文件夾層次結構是main.py和兩個嵌套文件夾domains/entities每個文件夾除最高級別(即main.py所在的級別)之外都有一個__init__.py文件。

畫報:

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