Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何导入模块并更改模块内的变量值并执行它_Python_Import_Python Import_Python 2.6 - Fatal编程技术网

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

Python 如何导入模块并更改模块内的变量值并执行它,python,import,python-import,python-2.6,Python,Import,Python Import,Python 2.6,我有一个模块,我需要在该模块的导入实例中导入和更改特定的变量值,然后执行它 请注意由于遗留原因,我无法对导入的模块进行任何更改 以下是我试图做的: 假设我要导入的模块a.py如下所示 var1 = 1 var2 = 2 if __name__ == '__main__': print var1+var2 现在我在b.py中导入它,调用方脚本。我正在尝试导入它,更改变量var1的值,并使用runpy将其作为主程序运行,如下所示 import runpy import a a.var1

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

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

以下是我试图做的:

假设我要导入的模块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

在不改变a.py中的任何内容的情况下,有没有其他方法来实现这一点(除了使用runpy之外)?开放给任何第三方模块,只要我不必对导入的模块进行更改


我正在使用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的正确定义

如果你真的想这么做,你需要
ast
模块,我相信。@WayneWerner请让我知道你真的不应该这样做,而只是使用一个类来代替。@XanderLuciano只要我不需要更改一个类,任何方法都可以。py@MohitC那么您可能想做的就是复制
中的任何内容,如果在您自己的代码中
块,然后像你已经做的那样简单地改变这些值。块中不应该有那么多代码,除非编写得非常糟糕。这太棒了!非常感谢你的帮助。:)您为我节省了2天的时间,这可能是因为您需要检查所有遗留脚本并对它们进行必要的更改,而不会破坏体系结构的其余部分。虽然这样做可行,但这样做所节省的任何工作都可能会被人们不得不处理它时产生的额外工作所抵消。它产生了非常紧密的非局部耦合,通过读取它修改的代码无法检测到,这使得更改系统的任何部分变得更加困难。当人们的赋值语句被完全忽略时,他们会非常困惑。@user2357112完全同意!我希望OP能意识到你刚才说的话。我意识到这一点,并同意你们两人的意见,但同时,这将适合我的特定用例,不会在系统中造成任何混乱。非常感谢。