我在使用子进程模块重定向另一个程序的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文档,但它没有解释冲洗问题,或者:(好吧......)
不适合你的例子,但有助于理解潜在的问题:进程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文档,但它没有解释冲洗问题,或者:(好吧......)