2010-01-02 33 views
1

我有試圖讓蟒蛇接受進口「全球」蟒蛇導入模塊工作在全球

在需要引入取決於另一個變量的另一個模塊一個模塊一個問題,但它似乎沒有不將它導入到所有模塊函數中,如果我在啓動函數中有它;例如:

def start(): 
    selected = "web" 
    exec("from gui import " + selected + " as ui") 
    log("going to start gui " + selected) 
    ui.start() 

這個工作,但在同一個模塊:

def close(): 
    ui.stop() 

不起作用。我不知道是怎麼回事就在這裏

+3

有(很多)更好的方式來動態選擇一個模塊導入。如果您有興趣,請檢查過去的問題或詢問新問題。作爲改進方法的副作用,您也不會遇到您在此處看到的問題。 –

+0

對不起,我選擇了這種方式,它對我來說很棒。無論如何,謝謝 –

+6

認真。不要使用'exec'。幾乎從來沒有一個很好的理由。如果你必須從一個動態名稱進行導入(並且它有點代碼味道),請看'__import__'函數,例如:'global ui' ...'ui = __import __(selected)'。 – bobince

回答

8
import gui 
ui = None 

def start(): 
    selected = "web" 
    log("going to start gui " + selected) 
    global ui 
    __import__("gui.%s" % selected) # if you're importing a submodule that 
            # may not have been imported yet 
    ui = getattr(gui, selected) 
    ui.start() 
+0

+1:總是有一種更簡單,更清潔的方式。 –

+0

如果「選中」是一個子模塊,則這不起作用。爲此,請首先執行「__import __('ui。'+ selected)」。 –

0

您可以提供的exec範圍與in。試試這個:

exec("from gui import " + selected + " as ui") in globals() 
0

您正在將ui模塊導入start()函數作用域。您應該將模塊導入全局範圍。爲此,您可以在兩個函數(啓動和關閉)之前導入模塊,或者將全局範圍提供給exec()函數。

示例:爲exec方法提供全局範圍。

exec("from gui import " + selected + " as ui") in globals() 
+0

thnx。你有相同的答案,但我必須選擇其中一個 –

+0

你做出了正確的選擇。伊姆拉姆寫的消息是之前發送的。 =] –

2

爲什麼要這樣做?爲什麼不使用內建的__import__?另外,您對gui的綁定對於函數start是本地的。