热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

带有Python子进程的IPC

如何解决《带有Python子进程的IPC》经验,请帮忙看看怎么搞?

我正在尝试在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上仍然失败。


推荐阅读
author-avatar
moquan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有