2017-02-28 105 views
1

我在同一級別上有以下簡單文件夾,並想知道從foo2加載foo1subfoo1有什麼好的做法?此外,我想從main加載foo2Python 3 - 如何正確加載模塊

MyFolder/main.py 
MyFolder/Folder1/Subfolder1/subfoo1.py 
MyFolder/Folder1/foo1.py                 
MyFolder/Folder2/foo2.py 

我知道有類似的問題,但我不明白最佳實踐。到目前爲止,我正在使用sys.path.append()。這裏有沒有__init__.py的目的?我很欣賞一些建議。

+0

是您的'main.py'唯一文件將會運行(如'__main__'),對吧? – nbro

+0

是和不是,我已經創建了一個用於數據分析的lil工具箱,其中main.py中包含主要分析。不過,我也可以使用'foo2'作爲一個獨立的工具(取決於'foo1')。 – Tim

+0

Sry,我不得不糾正我對一個錯字的評論。 – Tim

回答

1

如果你運行你的應用程序main.py(和關於您的問題,沒有其他相關細節缺失),那麼我會簡單地這樣做:

裏面MyFolder/main.py,我會寫:

from Folder2.foo2 import * # Or import single functions or classes 

,並從裏面MyFolder/Folder2/foo2.py,你寫

from Folder1.foo1 import * 
from Folder1.Subfolder1.subfoo1 import * 

我代表處在我的文件系統上引導你的結構,我也試過了,它適用於我。

相反,如果你也跑作爲__main__MyFolder/Folder2/foo2.py(如你所說的評論可能會發生),那麼這將不會是因爲在以下進口工作:

from Folder1.foo1 import * 
from Folder1.Subfolder1.subfoo1 import * 

的Python顯然不識貨Folder1(及其所有子文件夾或模塊),因爲您的新根文件夾爲Folder2,並且只有在您運行__main__文件的文件夾(或程序包)下才能從__main__文件導入模塊或程序包。

您可以通過附加MyFoldersys.path(即做類似於你已經做了什麼事),或通過以不同的方式設置你的項目解決這個問題,這是你的包的根文件夾下有一個setup.py文件。我想說,最後一個選項實際上是處理Python包和模塊的最嚴肅的選擇,如果你不創建玩具程序。

檢查this example我爲我的一個項目創建的setup.py。但是如果你對這個選項感興趣(如果你有時間的話,你應該),我會鼓勵你閱讀一篇關於如何用setup.py文件創建一個項目的體面教程,並且我會試着去理解它是如何以及爲什麼的是有用的,等等。


關於__init__.py文件。它們可能是空文件(但可以包含可運行的代碼和註釋),您可以將它們放在項目文件夾下,以指示Python將這些文件夾視爲Python包...我會再次鼓勵您閱讀一個(或多個)教程關於這個話題。

從Python 3.3開始,您不需要在您的文件夾下放置這些__init__.py文件,以使它們被視爲軟件包。

因此,如果您使用的是Python 3以前的版本。3,並且您的項目文件夾下沒有包含__init__.py,我的第一個解決方案可能不會工作(但我不能確定100%)...

+0

Thx提示'setup.py'。只要時間允許,我一定會研究一下。 – Tim