2016-07-05 119 views
5

我有一个模块,我需要导入并更改该模块的导入实例中的特定变量值,然后执行它。如何导入模块并更改模块中的变量值并执行它

请注意,由于遗留原因,我无法对正在导入的模块进行单个更改。

这里就是我想要做:

说模块I要导入,a.py,看起来像

var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

现在我在b.py导入此,主叫脚本。我试图导入它,更改变量var1的值,并使用runpy作为主程序运行,如下所示。

import runpy 
import a 

a.var1 = 2 
result = runpy._run_module_as_main(a.__name__) 

但这打印结果为3,不作为4预期。

任何其他方式来实现这一点(除了使用runpy)而不改变a.py中的任何东西?只要我不需要对导入的模块进行更改,就可以打开任何第三方模块。

我使用Python 2.6

+1

如果你真的*想要这样做,你会需要'ast'模块,我相信。 –

+0

@WayneWerner请让我知道 – MohitC

+0

你*真*不应该这样做,只是使用类而不是。 –

回答

3

这里是一个具体的实现什么,我在评论中提出:

#File temp.py 
var1 = 1 
var2 = 2 

if __name__ == '__main__': 
    print var1+var2 

我通过另一个文件run.py.调用它关键是要有另一个类似的类,它可以避免模块在导入/运行时可能发生变化的任何变化。这个字典保存你想要改变其值的变量。

#File: run.py 
class UpdatedDict(dict): 
    def __setitem__(self, key, value): 
     if key != "var1": 
      super(UpdatedDict, self).__setitem__(key, value) 

u = UpdatedDict({"var1": 10, '__name__': '__main__'}) 
exec open("temp.py").read() in u #u here is the globals() for the module. 

输出

~/Temp$ python run.py 
12 #Yay! 

注意:这是一个快速和肮脏的实施,只是为了告诉你,你可以做到这一点。我建议通过runpy,并使此代码看起来更健壮。现在,它是一个正确的定义hackish

+0

这很棒!非常感谢。 :)您可能需要通过所有旧版脚本并对其进行必要的更改,而不会中断其他体系结构,从而为我节省了2天时间。 – MohitC

+0

虽然这可行,但由于这样做而节省的工作很可能被人们不得不处理的额外工作所抵消。它创建了非常紧密的非本地耦合,通过读取它修改的代码无法检测到,使得更改系统的任何部分变得更加困难。当他们的任务陈述被完全忽略时,人们会非常困惑。 – user2357112

+0

@ user2357112完全不同意!我希望OP能够实现你刚刚所说的话。 – SuperSaiyan