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

时间:2015-11-02 17:49:06

标签: python import root-framework pyroot

我有以下标准导入程序:

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 *过程相同?

3 个答案:

答案 0 :(得分:2)

由于在python中如何实现局部变量,你不能这样做。由于您不知道可能导入的所有变量,因此无法将它们声明为全局变量。

至于为什么你不能在函数中导入未知的本地人。这是因为在编译时python建立了可能存在的所有不同的可能本地(任何直接分配给并且尚未声明为全局或非本地的东西)。这些本地的空间是在与函数的每次调用相关联的数组中进行的。然后,所有本地数据都由它们在数组中的索引而不是它们的名称引用。因此,解释器无法为未知的本地人创造额外的空间,也不知道如何在运行时引用它们。

答案 1 :(得分:0)

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

Python: how to make global imports from a function

示例:

def example_function():
    global module
    import module

答案 2 :(得分:0)

这可能会错过各种各样的角落案例,但这是一个开始:

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

强制性免责声明:如果您正在导入*,那么您可能做错了。但我想可能会出现导入*是较小的邪恶的情况。