gpt4 book ai didi

python - 带有 Python 子进程的 IPC

转载 作者:太空狗 更新时间:2023-10-30 01:01:12 25 4
gpt4 key购买 nike

我正尝试在 Python 中执行一些简单的 IPC,如下所示:一个 Python 进程使用 subprocess 启动另一个进程。子进程将一些数据发送到管道中,父进程接收它。

这是我当前的实现:

# parent.py
import pickle
import os
import subprocess
import sys
read_fd, write_fd = os.pipe()
if hasattr(os, 'set_inheritable'):
os.set_inheritable(write_fd, True)
child = subprocess.Popen((sys.executable, 'child.py', str(write_fd)), close_fds=False)
try:
with os.fdopen(read_fd, 'rb') as reader:
data = pickle.load(reader)
finally:
child.wait()
assert data == 'This is the data.'
# child.py
import pickle
import os
import sys
with os.fdopen(int(sys.argv[1]), 'wb') as writer:
pickle.dump('This is the data.', writer)

在 Unix 上这按预期工作,但如果我在 Windows 上运行这段代码,我会收到以下错误,之后程序挂起直到被中断:

Traceback (most recent call last):
File "child.py", line 4, in <module>
with os.fdopen(int(sys.argv[1]), 'wb') as writer:
File "C:\Python34\lib\os.py", line 978, in fdopen
return io.open(fd, *args, **kwargs)
OSError: [Errno 9] Bad file descriptor

我怀疑问题是子进程没有继承 write_fd 文件描述符。我该如何解决这个问题?

代码需要兼容Python 2.7、3.2及所有后续版本。这意味着解决方案不能依赖于 PEP 446 中指定的文件描述符继承更改的存在或不存在。 .如上所述,它还需要同时在 Unix 和 Windows 上运行。

(回答几个显而易见的问题:我不使用 multiprocessing 的原因是,在我真实的非简化代码中,这两个 Python 程序是 Django 项目的一部分不同的设置模块。这意味着它们不能共享任何全局状态。此外,子进程的标准流正用于其他目的,因此不可用。)

更新:设置close_fds 参数后,代码现在可以在Unix 上的所有Python 版本中运行。但是,它在 Windows 上仍然失败。

最佳答案

subprocess.PIPE 为所有平台实现。为什么不直接使用它呢?

如果您想手动创建和使用 os.pipe(),您需要注意 Windows 不支持 fork()。它宁愿使用 CreateProcess() 默认情况下不会让 child 继承打开的文件。但有一种方法:每个文件描述符都可以显式地继承。这需要调用 Win API。我已经在 gipc 中实现了它,请参阅 _pre/post_createprocess_windows() 方法 here .

关于python - 带有 Python 子进程的 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com