Moh*_*itC 5 python import python-2.6 python-import
我有一个模块,我需要导入并更改该模块的导入实例中的特定变量值,然后执行它.
请注意,由于遗留原因,我无法对导入的模块进行任何更改.
这是我想要做的:
说我要导入的模块,a.py,看起来像
var1 = 1
var2 = 2
if __name__ == '__main__':
print var1+var2
Run Code Online (Sandbox Code Playgroud)
现在我在调用者脚本b.py中导入它.我试图导入它,更改变量var1的值,并使用runpy将其作为主程序运行,如下所示.
import runpy
import a
a.var1 = 2
result = runpy._run_module_as_main(a.__name__)
Run Code Online (Sandbox Code Playgroud)
但是这会打印结果,3而不是4预期的结果.
任何其他方法来实现这一点(除了使用runpy)而不改变a.py中的任何内容?只要我没有在导入的模块中进行更改,就可以打开任何第三方模块.
我正在使用python 2.6
这是我在评论中提出的具体实现:
#File temp.py
var1 = 1
var2 = 2
if __name__ == '__main__':
print var1+var2
Run Code Online (Sandbox Code Playgroud)
我通过另一个文件 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.
Run Code Online (Sandbox Code Playgroud)
输出
~/Temp$ python run.py
12 #Yay!
Run Code Online (Sandbox Code Playgroud)
注意:这是一个快速而肮脏的实现,只是为了向您展示如何做到这一点。我建议仔细检查runpy并使这段代码看起来更健壮。现在的情况是,这是hackish的正确定义