Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 - Fatal编程技术网

Python 是否有方法跨进程修补对象?

Python 是否有方法跨进程修补对象?,python,Python,我有一个主python进程,它运行另一个python进程。我想修补或设置子进程的某些属性,以便它只使用我为其设置的内容,而不是其中定义的内容 澄清一下:子进程有一个函数foo(),但我想在父进程中将它改为foobar(),这样当foo被“调用”时,它就会执行“foobar” 根据我所学,我很确定这叫做猴子修补术,但我不知道其他人怎么称呼它 这主要是为了测试我开发的代码 我尝试在Popen()中使用preexec_fn来完全更改函数 在我的孩子过程中: def foo(): "do this

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

我希望它打印“改为做这个”,但实际输出是“做这个”


任何帮助或想法都将不胜感激

只是一个提示,但是猴子补丁让调试变得很糟糕。虽然这在Ruby中是一种常见的做法,但在python中却一直不受欢迎。如果你一定要这么做,你需要在一条巨大的注释中标出你在做什么,向继承你代码的人解释为什么你不能没有它

因此,如果希望子进程执行与主进程不同的操作,最合适的做法是向其传递一个参数

当您调用子函数时,它应该传递一个参数,让它知道如何交换该函数

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

编辑:pre-exec函数是在程序分叉(在内存中复制自身)之后,在子副本调用exec(将其交换为您提供的程序名的新副本)之前调用的函数。它用于在单线程环境中设置环境变量或其他内容。使用python多年来,我从未接触过它。

您正在测试吗?如果是这样的话,你看过unittest中的Mock或MagicMock类了吗?是的,我试过MagicMock,没有帮助。此外,我仅限于此方法,因为我使用的平台不支持或不支持MagicMock edit:typosThanks,但此方法不被接受,因为我尝试实现的只是测试。实际实现不需要辅助功能。我所展示的只是一个例子。出于所有未知的原因,在实例化之前,我可能需要使用父类中的类来修补子类中的类。经过仔细考虑,我觉得这是最好的方法,但只是部分。更简单的方法是调用另一个文件,比如说'before_child.py',然后对该子文件进行修补,使您能够控制它。因此,现在您的“before_child.py”具有您想要的所有修补程序,并且如果您的孩子不是子进程调用,则可以执行这些修补程序