2015-11-02 36 views
0

我有以下标准导入过程:如何从函数内执行`import *`?

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 

我怎样才能导入根模块从功能中,使得脚本的操作的结果是一样的上述from ROOT import *程序?

+1

你不应该需要做那些东西。这听起来像你在ROOT.py中没有正确的'main()'函数和'if __name__ =='__main __':'main()'。 –

+0

@ PM2Ring感谢您的评论。 'ROOT.py'是一个模块,而不是脚本。它不具有'main'功能。另外,它是[ROOT](https://root.cern.ch/)框架的Python绑定基础结构,所以它不是我可以轻易更改的东西。我需要关注对脚本的更改,而不是模块。 – d3pd

+0

啊,好的。如果可以的话,尽量避免[from import *](http://stackoverflow.com/questions/2386714/why-is-import-bad)。 –

回答

2

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

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

0

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

Python: how to make global imports from a function

例如:

def example_function(): 
    global module 
    import module 
+0

感谢您的建议。我认为这种方法等同于'将ROOT引入ROOT',*不引用ROOT * * *。 – d3pd

0

这可能会缺少各种极端情况,但它是一个开始:

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

强制性条款:如果要导入*,你可能就错了。但我想可能会出现这样的情况,import *是较小​​的恶意。