2010-01-02 7 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.