0

我有以下标准导入程序:

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

4

3 回答 3

2

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

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

于 2015-11-02T19:45:28.147 回答
0

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

Python:如何从函数进行全局导入

例子:

def example_function():
    global module
    import module
于 2015-11-02T17:52:35.013 回答
0

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

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

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

于 2015-11-02T21:23:01.737 回答