作者:moquan | 来源:互联网 | 2023-05-21 19:34
我正在尝试在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上运行此代码,则会收到以下错误,此后程序将挂起直到被中断:
# 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.'
我怀疑问题在于子进程没有继承write_fd
文件描述符。我怎样才能解决这个问题?
该代码必须与Python 2.7、3.2和所有后续版本兼容。这意味着该解决方案不能依赖于PEP 446中指定的文件描述符继承更改的存在与否。如上所述,它还需要在Unix和Windows上运行。
(回答几个明显的问题:我不使用的原因multiprocessing
是,在我的现实生活中非简化的代码中,这两个Python程序是Django项目的一部分,具有不同的设置模块。这意味着它们无法共享而且,子进程的标准流正在用于其他目的,并且不能用于此目的。)
更新:设置close_fds
参数后,代码现在可以在Unix上的所有Python版本中使用。但是,它在Windows上仍然失败。