python导入模块以全局工作

python导入模块以全局工作,python,import,module,Python,Import,Module,我在尝试让python接受“全局”导入时遇到问题 在一个模块中,它需要根据另一个变量导入另一个模块,但如果我在start函数中有它,它似乎不会将它导入所有模块函数中;例如: def start(): selected = "web" exec("from gui import " + selected + " as ui") log("going to start gui " + selected) ui.start() 这在同一模块中起作用: def clos

我在尝试让python接受“全局”导入时遇到问题

在一个模块中,它需要根据另一个变量导入另一个模块,但如果我在start函数中有它,它似乎不会将它导入所有模块函数中;例如:

def start():
    selected = "web"
    exec("from gui import " + selected + " as ui")
    log("going to start gui " + selected)
    ui.start()
这在同一模块中起作用:

def close():
    ui.stop()
不起作用。我不知道这里发生了什么

Joe

您可以在中使用
提供的范围。试试这个:

exec("from gui import " + selected + " as ui") in globals()
您可以在
中使用
提供的范围。试试这个:

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

您正在将ui模块仅导入start()函数作用域。您应该将模块导入全局范围。为此,可以在两个函数(start和close)之前导入模块,或者为exec()函数提供全局作用域

示例:为exec方法提供全局范围

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

您正在将ui模块仅导入start()函数作用域。您应该将模块导入全局范围。为此,可以在两个函数(start和close)之前导入模块,或者为exec()函数提供全局作用域

示例:为exec方法提供全局范围

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

你为什么要这样做?为什么不使用内置的
\uuuuu导入\uuuuuu
?另外,您对
gui
的绑定是函数
start

的本地绑定,为什么要这样做?为什么不使用内置的
\uuuuu导入\uuuuuu
?此外,您对
gui
的绑定是函数
start

的本地绑定,有(更多)更好的方法动态选择要导入的模块。检查过去的问题,如果你感兴趣,可以问一个新问题。作为改进方法的一个副作用,您也不会遇到您在这里看到的问题。对不起,我选择了这种方法,它对我来说非常有效。无论如何,谢谢你,说真的。不要使用
exec
。几乎从来没有一个好的理由。如果必须从动态名称导入(这有点代码味道),请查看
\uuuu import\uuuu
函数,例如:
global ui
ui=\uu import\uuu(选中)
。这是一种可怕的导入方式。在未来的某个时刻,它要么会猛烈地崩溃,要么会失控。好吧,各位。。我将改变它:这里有(更多)更好的方法来动态选择要导入的模块。检查过去的问题,如果你感兴趣,可以问一个新问题。作为改进方法的一个副作用,您也不会遇到您在这里看到的问题。对不起,我选择了这种方法,它对我来说非常有效。无论如何,谢谢你,说真的。不要使用
exec
。几乎从来没有一个好的理由。如果必须从动态名称导入(这有点代码味道),请查看
\uuuu import\uuuu
函数,例如:
global ui
ui=\uu import\uuu(选中)
。这是一种可怕的导入方式。在未来的某个时刻,它要么会猛烈地崩溃,要么会失控。好吧,各位。。我来换一下:Dthnx。你得到了同样的答案,但我不得不从中挑选一个你做了正确的选择。Imram编写的消息之前已发送。=]thnx。你得到了同样的答案,但我不得不从中挑选一个你做了正确的选择。Imram编写的消息之前已发送。=]如果“selected”是子模块,则此操作不起作用。为此,请首先执行“\uuuu导入”\uuuu('ui.+selected')。如果“selected”是子模块,则此操作不起作用。为此,请首先执行“\uuuu导入”\uuuuu('ui.+selected')。
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()