我有以下标准导入程序:
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 *
过程相同?
答案 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__)
强制性免责声明:如果您正在导入*,那么您可能做错了。但我想可能会出现导入*是较小的邪恶的情况。