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

How to import a module and change a variable value inside module and execute it

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

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

这是我正在尝试做的事情:

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

var1 = 1
var2 = 2

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

现在我将其导入 b.py,调用者脚本。我正在尝试导入它,使用 运行py 如下更改变量 var1 和 运行 的值作为主程序。

import runpy
import a

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

但这打印的结果仅为 3 而不是预期的 4

在不更改 a.py 中的任何内容的情况下,还有其他方法可以实现此目的(除了使用 运行py 之外)吗?只要我不需要对导入的模块进行更改,就可以对任何第三方模块开放。

我正在使用 python 2.6

下面是我在评论中提出的具体实现:

#File temp.py
var1 = 1
var2 = 2

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

我正在通过另一个文件调用它 run.py。关键是要有另一个像 class 这样的 dict,它不受模块可能在 importing/running 上更改的变量的任何更改的影响。该字典包含您要更改其值的变量。

#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

的正确定义