我有一个主要的python进程,它运行另一个python进程。我想修补或设置子进程的某些属性,以使其仅使用我为其设置的内容,而不使用其中定义的内容。
为了阐明这一点:子进程具有函数foo(),但我想在其父级中将其更改为foobar(),以便当foo被“调用”时,它将执行“ foobar”。
根据我所学的知识,我很确定这被称为“猴子修补”,但我不知道其他人将其称为什么
这主要是为了测试我开发的代码
我尝试在Popen()中使用preexec_fn来完全更改功能
在我的子进程中:
def foo():
"do this"
在我的父母中:
def foobar():
print "do this instead"
def pre_exec():
import child
setattr(child, 'foo', foobar)
Popen(['python', 'child.py'],preexec_fn=pre_exec)
我希望它打印“改为执行此操作”,但实际输出为“执行此操作”。
任何帮助或想法都会受到赞赏!
答案 0 :(得分:0)
只是一个注释,但是猴子补丁使调试变得很糟糕。尽管这在Ruby中是一种常见的做法,但在python中却一直对此持反对态度。如果您绝对必须这样做,则需要在巨大的注释中标出您正在做的事情,向任何继承您代码的人解释为什么没有它就无法做。
因此,如果您希望子进程执行与主要进程不同的操作,则最合适的方法是为其传递一个参数。
当您调用子代时,它应该传递一个参数以告知其换出该函数。
Popen(['python', 'child.py', '--use-alternate-function'])
edit:pre exec函数是在程序派生(在内存中复制其自身的副本)之后,子副本调用exec(将其替换为您提供的程序名称的新副本)之前调用的函数。 )。它用于设置环境变量或在单线程环境中的任何变量。在使用python的多年中,我从不需要接触它。