假設welcome
在easygui.py
,你想要:
def main():
externals.easygui.welcome()
由於這些東西可以讓繁瑣的類型,它往往習慣性地導入子包下一個縮寫名稱:
import externals.easygui as eg
def main():
eg.welcome()
或者,如果你可以讓整個事情包加入__init__.py
,然後你可以控制哪些會從那裏進口的命名空間...
至於進口橫着走,這是我建立了一個測試的目錄結構:
steffen
|- __init__.py
|- main.py
|- easygui
|- __init__.py
|- gui.py
|- external
|- __init__.py
|- welcome.py
現在,(爲了簡單起見)每個__init__.py
只是導入包含在該目錄中的文件/模塊。所以,在斯特芬:
#steffen.__init__.py
import main
import easygui
import external
和外部
#steffen/external/__init__.py
import welcome
等等。
的實際代碼:
main.py:
import easygui
def main():
easygui.gui.welcome()
easygui/gui.py:
import steffen.external as se
def welcome():
se.welcome.hello()
外部/歡迎。py
def hello():
print "Hello"
現在我可以使用所有這些。在斯特芬的父目錄(只是爲了確保包斯特芬是PYTHONPATH),我可以:
import steffen
steffen.main.main()
唷!現在,有steffen.main.main()
有點傻。如果你想指的是功能只是steffen.main()
,您可以在steffen.__init__.py
設置了。只需將其更改爲:
#steffen.__init__.py
from main import main
import easygui
import external
所以,如果你想在__init__.py
調用一個函數由foo.func()
,你會在進口steffen
一個腳本中調用它steffen.foo.func()
。同樣,如果你會調用該函數爲foo()
在__init__.py
,你會在進口斯特芬一個腳本中調用它steffen.foo()
。希望這是有道理的。在我能想出的這個最簡單的工作例子中,有很多東西需要消化。有利的一面,如果你能在所有的這方面的工作,並瞭解它,那麼你知道幾乎所有有知道如何編寫Python包(我們還沒有談到這可能在這裏也可以使用相對導入,或者寫一個setup.py
到實際上安裝你的軟件包,但是一旦你理解了這些東西,這些都很容易理解)。
這是有點混亂,所有的功能都來自哪裏(被MSGBOX意味着要從哪裏來)。你在gui.py中說歡迎,然後說它在一個名爲welcome.py的文件中。我認爲你需要重新閱讀你的問題並適當地編輯它。 – Dunes
是的。在代碼示例中是一個命名錯誤。這是gui.py。 welcome()在gui.py中。固定。 – Steffen