如何导入模块并更改模块内的变量值并执行它
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
的正确定义
我有一个模块,我需要在该模块的导入实例中导入和更改特定变量值,然后执行它。
请注意由于遗留原因,我无法对正在导入的模块进行单一更改。
这是我正在尝试做的事情:
说我要导入的模块,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