2013-12-15 35 views
11

我知道這個問題在這裏已被多次詢問,我可能讀了大多數答案(包括thisthat)以及python文檔,但仍然無法找到我非常簡單的導入問題的答案。這很簡單,我必須錯過一些愚蠢的事情,但我還沒有看到它。 我已經安裝的結構如下:Python無法從子目錄中導入模塊,即使目錄中有一個名爲__init.py__的文件

myproject 
    myscript.py 
    MyPackage 
     __init.py__ 
     mymodule.py 

只想加載從myscript.pymymodule.p Y(或應該是相同的命令行python解釋)。

myscript.py包含:

#!/usr/bin/python 
import MyPackage 

__init.py__包含:

from . import mymodule 

mymodule.py包含

#!/usr/bin/python 

def myfunction(): 
    print "mymessage" 

我的目標是調用myfunctionmyscript.py但如果我嘗試調用模塊我得到

$python myscript.py 
Traceback (most recent call last): 
    File "myscript.py", line 2, in <module> 
    import MyPackage 
ImportError: No module named MyPackage 

我已經嘗試過:

  • 我試圖OSX和Ubuntu Linux下的一切,以減少故障的Python安裝的可能性。
  • 我將PYTHONPATH環境變量設置爲myproject目錄以及.以及兩者。
  • 我離開__init.py__空白
  • 我試過import語句也從Python解釋器從myproject目錄
  • 我嘗試以下import語句開始:

    from MyPackage import mymodule 
    import MyPackage.mymodule 
    import MyPackage.mymodule as module 
    

    都沒有成功(同樣的錯誤消息)。

如果我將mymodule.py放在項目目錄中而不使用包,導入可以正常工作。但我不明白爲什麼從子包導入不起作用。 任何想法如何讓我的工作?

感謝您的幫助!

+0

您需要驗證'myproject'目錄是否列在'sys.path'中。在導入'MyPackage'之前,'sys.path'是否包含正確的目錄? –

+0

如果我啓動解釋器並執行'import sys'和'print sys.path',它會顯示一個包含正確「myproject」目錄路徑的列表:'['','/ Users/michael/Entwicklung/python/myproject ',...]' – mhelwig

+0

對,所以包應該是可導入的。包中可能有*不同*導入錯誤*。你說你已經嘗試了一個空的'__init __。py'。你可以再試一次,但確保你刪除了所有'* .pyc'文件。也許在'__init __。py'中添加一個'print'導入的''行。 –

回答

7

在編輯您的文章的格式時,我注意到您正在調用您的文件__init.py_。這會導致python無法識別您的MyPackage目錄作爲一個包,因此ImportError: No module named MyPackage

應該改爲__init__.py(名稱__init__,擴展.py)。那麼它會起作用,你的項目結構和進口報表是正確的。

儘管有一個小問題:您還應該使用lower_underscore樣式來命名您的包。包也是Python中的模塊,它們應該遵循相同的命名約定。有關建議的樣式和命名約定的詳細信息,請參閱PEP8。這只是慣例雖然,它與你的問題沒有任何關係。

+0

Python區分大小寫,因此即使在Windows下,包結構和導入也不會匹配。 –

+0

確實如此,它們在他的描述中完全匹配:他將包稱爲「MyPackage」,並將其導入爲「import MyPackage」和模塊「mymodule.py」,並將其導入或引用爲「from .. import mymodule' 。您在模塊和包裝之間同步外殼是完全沒有必要的。 –

+1

哇,我真的印象深刻,我花了三個或更多的時間來解決這個問題,雖然一遍又一遍地閱讀文檔,我完全忽略了你發現的'__init __。py'的錯誤命名。完善!現在它終於起作用了,所以謝謝你的回答! – mhelwig

相關問題