我正在尝试用Python进行简单的IPC,步骤如下:一个Python进程使用
以下是我当前的实现方式:
在Unix上,这段代码按预期工作,但如果我在Windows上运行此代码,则会出现以下错误,之后程序一直挂起直到被中断:
我怀疑问题在于子进程没有继承
这段代码需要与Python 2.7、3.2和以后的所有版本兼容。这意味着解决方案不能依赖于PEP 446中指定的文件描述符继承更改的存在或缺失。正如上面所暗示的,它还需要在Unix和Windows上运行。
(回答一些显而易见的问题:我之所以不使用
更新:在设置了
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上仍然失败。