2012-10-10 39 views
1

我有一個主文件,名爲'main.py'和兩個子文件夾。一個叫'外部',包含'easygui.py',另一個叫'模塊',包含一個名爲'gui.py'的文件。如何爲所有功能導入模塊?

該程序通過main.py

我導入easygui在main.py與import externals.easygui開始。我輸入modules.gui

但是,當我打電話的歡迎功能,它不知道easygui,我必須導入它的功能。由於我想調用更多easygui函數,因此我不想在每個def中導入easygui。

這怎麼解決?

在此先感謝!

斯特芬

例子(爲便於閱讀,而不嘗試/除和評論的東西):

main.py:

#!/usr/bin/env python 

import externals.easygui 
import modules.gui 

main(): 
    gui.welcome() 

gui.py:

def welcome(): 
    msgbox("Welcome!", ok_button="Ok") 
+0

這是有點混亂,所有的功能都來自哪裏(被MSGBOX意味着要從哪裏來)。你在gui.py中說歡迎,然後說它在一個名爲welcome.py的文件中。我認爲你需要重新閱讀你的問題並適當地編輯它。 – Dunes

+0

是的。在代碼示例中是一個命名錯誤。這是gui.py。 welcome()在gui.py中。固定。 – Steffen

回答

3

假設welcomeeasygui.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到實際上安裝你的軟件包,但是一旦你理解了這些東西,這些都很容易理解)。

+0

welcome()在gui中,不在easygui中。有兩個不同的文件夾和兩個不同的py文件。 – Steffen

+0

@Steffen - 那麼你是說'modules'目錄中的文件依賴於'externals'目錄中的文件? – mgilson

+0

是的。這很奇怪嗎? :) – Steffen

0

每一個源文件都需要有自己的進口,因爲他們不知道其他模塊的進口。您必須在文件頂部的modules.gui.py中包含import externals.easygui

例如。 gui.py

from externals.easygui import msgbox 

def welcome(): 
    msgbox("Welcome!", ok_button="Ok") 
+0

好的,這就是我現在正在做的事。我認爲可能有辦法做全球進口。 – Steffen

+0

我知道沒有編程語言允許適用於所有模塊/類的全局導入。我認爲不應該有。你的建議意味着gui.py甚至不知道它自己的依賴關係。 – Dunes

+0

沒有。我想到了通過@mgilson – Steffen

0

我們這裏有什麼...

導入gui.py模塊,並給它取名爲貴,這樣你只需要使用GUI標籤訪問該功能GUI 。

在gui.py模塊僅導入功能MSGBOX,這樣你就不必進口沒有其他的東西(如你想要這個)。

現在,當程序運行時它顯示了消息調用gui.welcome功能。

main.py

import modules.gui as gui 

def main(): 
    gui.welcome() 

if __name__ == "__main__": 
    main() 

gui.py在子文件夾中的模塊

from externals.easygui import msgbox 

def welcome(): 
    msgbox("Welcome!", ok_button = "Ok")