2010-01-02 5 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() 

이 작동하지 않습니다. 난 당신이 inexec의 범위를 제공 할 수있는 조

+3

가져올 모듈을 동적으로 선택하는 더 좋은 방법이 있습니다. 과거 질문을 확인하거나 관심이 있다면 새로운 질문을하십시오. 접근법 개선의 부작용으로 여기에있는 문제는 해결되지 않습니다. –

+0

죄송합니다, 나는이 방법을 선택했고 그것은 나를 위해 놀라운 작품. 어쨌든 고마워 –

+6

진지하게. 'exec'을 사용하지 마십시오. 거의 좋은 이유가 없습니다. 동적 이름에서 가져 오기를해야만한다면 (예를 들어 코드 냄새가 약간),''global ui' ...'ui = __import __ (selected)'와 같은'__import__' 함수를보십시오. – 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

"selected"가 하위 모듈 인 경우에는 작동하지 않습니다. 이를 위해 먼저 "__import __ ('ui.'+ 선택한 항목)"을 수행하십시오. –

0

여기

무슨 일이 일어나고 있는지 모른다. 이것을 시도하십시오 :

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

당신은 올바른 선택을했습니다. Imram이 쓴 메시지는 전에 보내졌습니다. =] –

2

왜 이렇게하고 싶습니까? 내장형 __import__을 사용하지 않는 이유는 무엇입니까? 또한 gui에 대한 바인딩은 start 로컬입니다.