python – 如何导入模块并更改模块内的变量值并执行它

前端之家收集整理的这篇文章主要介绍了python – 如何导入模块并更改模块内的变量值并执行它前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

请注意,由于遗留原因,我无法对导入的模块进行任何更改.

这是我想要做的:

说我要导入的模块,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

最佳答案
以下是我在评论中提出的具体实现:

#File temp.py
var1 = 1
var2 = 2

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

我通过另一个文件run.py调用它.关键是让另一个像类这样的dict不受模块在导入/运行它时可能改变的变量的任何变化的影响.此字典包含要更改其值的变量.

#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定义

猜你在找的Python相关文章