如何从函数中执行 `import *`?

How can I perform `import *` from within a function?

我有以下标准导入程序:

from ROOT import *

由于 ROOT 处理命令行选项和参数的方式,需要如下内容以避免搞砸脚本的命令行解析:

argv_tmp = sys.argv
sys.argv = []
from ROOT import *
sys.argv = argv_tmp

我需要在很多脚本中执行这个操作。这个操作可能会改变,或者可能会有更好的方法,所以我想把这个过程集中在某个导入模块提供的单个函数中,以便将来更改过程。

def import_ROOT():
    # magic

import os
import sys
import_ROOT()
import docopt

如何从函数中导入 ROOT 模块,使脚本的运行结果与上述 from ROOT import * 过程相同?

我相信这里已经有类似的问题了:

Python: how to make global imports from a function

示例:

def example_function():
    global module
    import module

由于 python 中局部变量的实现方式,您不能这样做。由于您不知道所有可能被导入的变量,因此您不能将它们声明为全局变量。

关于为什么不能在函数中导入未知局部变量。这是因为在编译时 python 建立了所有可能存在的不同可能的本地(任何直接分配给但未声明为全局或非本地的东西)。 Space 因为这些局部变量是在与函数的每次调用关联的数组中生成的。然后所有本地人都通过他们在数组中的索引而不是他们的名字来引用。因此,解释器无法为未知的局部变量创建额外的 space,也不知道如何在运行时引用它们。

这可能遗漏了各种极端情况,但这是一个开始:

def import_ROOT():
    import ROOT
    globals().update(ROOT.__dict__)

强制免责声明:如果您要导入 *,您可能做错了。但我想在某些情况下 import * 是次要的。