2012-01-21 101 views
54

我想將子文件夾導入爲模塊。因此每個子文件夾都包含__init__.py。我的文件夾結構是這樣的:從子文件夾導入模塊

src\ 
    main.py 
    dirFoo\ 
    __init__.py 
    foofactory.py 
    dirFoo1\ 
     __init__.py 
     foo1.py 
    dirFoo2\ 
     __init__.py 
     foo2.py 

在我的主腳本我導入

from dirFoo.foofactory import FooFactory 

在這家工廠的文件I包括子模塊:

from dirFoo1.foo1 import Foo1 
from dirFoo2.foo2 import Foo2 

如果我打電話給我的foofactory我得到的錯誤,蟒蛇無法導入子模塊foo1和foo2:

Traceback (most recent call last): 
    File "/Users/tmp/src/main.py", line 1, in <module> 
from dirFoo.foofactory import FooFactory 
    File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module> 
from dirFoo1.foo1 import Foo1 
    ImportError: No module named dirFoo1.foo1 

回答

79

沒有必要招惹你PYTHONPATHsys.path這裏。

要正確使用絕對導入一個包,你應該包括「根」軟件包名,以及,例如:

from dirFoo.dirFoo1.foo1 import Foo1 
from dirFoo.dirFoo2.foo2 import Foo2 

或者你可以使用relative imports

from .dirfoo1.foo1 import Foo1 
from .dirfoo1.foo1 import Foo2 
+24

有一點要記住!將'__init __。py'添加到您從中導入的每個子文件夾。 –

+3

空'__init __。py'可以完成這項工作。 – cerebrou

+0

如果以前'Foo1'在父目錄中,並且一個編碼類似於'from Foo1 import *'編寫的東西,語法會是什麼。有沒有辦法達到同樣的效果,所以你不必用'Foo1'來加前綴? – jxramos

3

設置您的PYTHONPATH環境變量。例如像這樣PYTHONPATH =。:(對於* nix系列)。

您也可以手動添加您的當前目錄(你的情況SRC)到PYTHONPATH:

import os 
import sys 
sys.path.insert(0, os.getcwd()) 
4

就在這裏通知。 (來自newbee,keviv22)

永遠不要爲了您自己的利益而命名帶有空格或符號的文件夾或文件,如「 - 」或「_」。如果你這樣做了,你可能會遇到一些問題。像我的,說,雖然你的導入命令是正確的,你將無法成功導入這些命名文件夾內可用的所需文件。

無效的文件夾namings如下:

  • 通用-類-文件夾
  • Generic_Classes_Folder

以上有效的文件夾namings:

  • GenericClassesFolder或Genericclassesfolder或genericClassesFolder(或者像這樣沒有任何空格或s字間pecial符號)

什麼錯誤,我做的:

考慮的文件結構。

Parent 
    . __init__.py 
    . Setup 
    .. __init__.py 
    .. Generic-Class-Folder 
     ... __init__.py 
     ... targetClass.py 
    . Check 
    .. __init__.py 
    .. testFile.py 

我想幹什麼?

  • from testFile.py,我想導入'targetClass。PY」通用級,文件夾裏面的文件文件中使用名爲‘functionExecute’功能‘targetClass.py’文件

我做了什麼命令?

  • 從 'testFile.py',從Core.Generic級-Folder.targetClass進口functionExecute寫命令,
  • 有像 「語法錯誤:無效的語法」 錯誤

試了很多搜索並查看了很多stackoverflow問題,無法確定哪裏出了問題。我交叉檢查了我的文件多次,我用__init__.py文件,插入環境路徑,並非常擔心出了什麼問題......

經過很長很長很長的時間,我想到了這一點,當與一位朋友礦。我很愚蠢的使用這種命名約定。我不應該使用空格或特殊符號來爲任何文件夾或文件定義名稱。所以,這是我想傳達的。祝你有美好的一天!

(對不起,對於這個巨大的帖子...只是讓我的挫折去... :)謝謝!)

+2

空格和破折號(「 - 」)會導致這種情況,但下劃線(「_」)仍然可以正常工作。 – cowlinator