有没有一种方法可以跨进程修补对象?

时间:2019-05-08 17:55:12

标签: python

我有一个主要的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)

我希望它打印“改为执行此操作”,但实际输出为“执行此操作”。

任何帮助或想法都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

只是一个注释,但是猴子补丁使调试变得很糟糕。尽管这在Ruby中是一种常见的做法,但在python中却一直对此持反对态度。如果您绝对必须这样做,则需要在巨大的注释中标出您正在做的事情,向任何继承您代码的人解释为什么没有它就无法做。

因此,如果您希望子进程执行与主要进程不同的操作,则最合适的方法是为其传递一个参数。

当您调用子代时,它应该传递一个参数以告知其换出该函数。

Popen(['python', 'child.py', '--use-alternate-function'])

edit:pre exec函数是在程序派生(在内存中复制其自身的副本)之后,子副本调用exec(将其替换为您提供的程序名称的新副本)之前调用的函数。 )。它用于设置环境变量或在单线程环境中的任何变量。在使用python的多年中,我从不需要接触它。