2017-01-23 96 views
-1

所以我看了一下這裏提到的各種類似的問題,但到目前爲止我沒有任何工作。從子文件夾導入模塊到父項

我有以下文件結構:

\folder 
    __init__.py 
    supClass.py 
    script1.py 
    \sub 
     __init__.py 
     script2.py 

所以在script2.py我嘗試導入supClass。如果我理解我在相關主題上閱讀的內容,我必須指定\folder是PYTHONPATH的一部分。

所以下面的例子我看了,我結束了這段代碼:

if __name__ == '__main__' and __package__ is None: 
    from os import sys, path 
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) 

from test_package import supClass 

    a = supClass() 
    a.print_sup() 

,但我得到了以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile 
    execfile(filename, namespace) 
    File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 
    File "C:/Donnees/Programmes_Python/Developpement/Tests/test_package/sub/script.py", line 18, in <module> 
    from test_package import supClass 
ImportError: No module named test_package 

我檢查\文件夾是現在的一部分PYTHONPATH在做

import sys 
print sys.path 

在我的控制檯,沒關係。但是,__package__變量保持設置爲無。

我得到的錯誤似乎說我的\folder不是一個模塊。我不明白爲什麼,也許我在「包」和「模塊」之間混淆了事物。

無論如何,如果有人有一個想法,它將不勝感激!

+1

'\ folder'的* parent *應該在'PYTHONPATH'上。假設'folder' =='test_package',然後你可以通過test_package import subClass和test_package.sub import script2來完成。請注意,從子文件夾執行腳本是有問題的(但如果您編寫'setup.py'文件則很容易)。有關更多信息,請參閱我的答案http://stackoverflow.com/a/41201868/75103。 – thebjorn

+0

這個工程!謝謝!但是,你能解釋爲什麼\文件夾的父母應該在PYTHONPATH上,而不僅僅是\文件夾本身? –

+1

由於'folder'是你的*包*,並且'import folder',因此Python需要查看包含*'文件夾'的目錄。 – thebjorn

回答

1

\folder應該是PYTHONPATH。那麼你可以做

from folder import subClass 

from folder.sub import script2 

folder應該對原因PYTHONPATH(而不是folder本身),是因爲folder是你的包,並import folder Python的需求在目錄看包含folder

請注意,從子文件夾執行腳本是有問題的,但如果您編寫setup.py文件則很容易。有關更多信息,請參閱我的答案stackoverflow.com/a/41201868/75103。

0

您是否嘗試導入supClass?

import supClass 

或者試試這個:

sys.path.append("../") 
import supClass 
+0

'import supClass'不起作用,並且我得到了'No module named supClass'錯誤,我得到的supClass不在與script2相同的文件夾中,既不是PYTHONPATH的一部分。第二個選項導致相同的錯誤。我認爲它和我的腳本一樣。 –

+0

從wich目錄執行python文件嗎?寫下你如何啓動該程序。 – Wonka

+0

我直接從我的IDE啓動程序,所以它應該從'\ sub'目錄我猜。 –

0

我試圖複製你的等級和該做的伎倆:

if __name__ == '__main__': 
    from os import sys, path 
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) 

    from supClass import supClass 
    a = supClass() 
    a.print_sup() 
+0

好吧,我試過了,確實有效!但我不明白爲什麼我不能導入directlty'test_package'。我想直接導入'test_package',以便我可以使用'__init __。py',它可以包含來自supClass import supClass語句的'' –

+0

__init__.py是一個包文件。你爲什麼要打電話? 看看這裏的文檔:https://docs.python.org/3/tutorial/modules.html#packages – al27091

+0

沒有'__init __。py'不是supClass()類的構造函數。 supClass具有自己的構造函數(這是一種名爲'__init__'的方法)。但'__init __。py'只是將文件夾定義爲python包所需的初始化文件。 –