当前位置:  开发笔记 > 编程语言 > 正文

如何使用子进程模块与进程正确交互

如何解决《如何使用子进程模块与进程正确交互》经验,为你挑选了1个好方法。

我在使用子进程模块重定向另一个程序的stdio时遇到问题.只是从stdout读取导致挂起,并且Popen.communicate()可以工作,但它在读/写后关闭管道.实现这个最简单的方法是什么?

我在Windows上玩这个:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read

Aaron Digull.. 17

不适合你的例子,但有助于理解潜在的问题:进程P启动子C. C子程序写了一些东西到它的stdout.C的stdout是一个具有4096个字符缓冲区且输出短于此的管道.现在,C等待一些输入.对于C,一切都很好.

P等待输出永远不会出现,因为操作系统没有理由刷新C的输出缓冲区(其中的数据太少).因为P永远不会得到C的输出,所以它永远不会写任何东西到C,所以C挂起等待来自P的输入.

修复:使用冲洗后,每写一个管强迫OS将数据发送现在.

在您的情况下,proc.stdin.flush()sys.stdout.flush()打印后添加主while循环和子循环中的a 应该可以解决您的问题.

您还应该考虑将从其他进程读取的代码移动到一个线程中.这里的想法是,您永远不会知道数据何时到达,并且使用线程可以帮助您在编写处理结果的代码时理解这些问题.

在这个地方,我想向您展示新的Python 2.6文档,但它没有解释冲洗问题,或者:(好吧......)



1> Aaron Digull..:

不适合你的例子,但有助于理解潜在的问题:进程P启动子C. C子程序写了一些东西到它的stdout.C的stdout是一个具有4096个字符缓冲区且输出短于此的管道.现在,C等待一些输入.对于C,一切都很好.

P等待输出永远不会出现,因为操作系统没有理由刷新C的输出缓冲区(其中的数据太少).因为P永远不会得到C的输出,所以它永远不会写任何东西到C,所以C挂起等待来自P的输入.

修复:使用冲洗后,每写一个管强迫OS将数据发送现在.

在您的情况下,proc.stdin.flush()sys.stdout.flush()打印后添加主while循环和子循环中的a 应该可以解决您的问题.

您还应该考虑将从其他进程读取的代码移动到一个线程中.这里的想法是,您永远不会知道数据何时到达,并且使用线程可以帮助您在编写处理结果的代码时理解这些问题.

在这个地方,我想向您展示新的Python 2.6文档,但它没有解释冲洗问题,或者:(好吧......)


Pexpect文档已经发生了变化:这里是[新链接](http://pexpect.readthedocs.io/en/stable/FAQ.html#whynotpipe)
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有