实时读取/写入子进程stdin / stdout

时间:2014-10-16 20:43:59

标签: python io subprocess

我想为另一个命令行程序制作一个Python包装器。

我希望尽快阅读Python stdin,过滤并翻译它,然后将其及时写入子计划stdin

与此同时,我希望尽快从儿童计划stdout中阅读,并在进行一些按摩后,立即将其写入Python {{1} }}

Python子进程模块充满了使用stdout来避免死锁的警告。但是,communicate()无法让我访问子计划communicate(),直到孩子终止。

2 个答案:

答案 0 :(得分:1)

免责声明:此解决方案可能要求您可以访问您尝试呼叫的流程的源代码,但无论如何都可能值得尝试。它取决于被调用的进程定期刷新其stdout缓冲区,这是非标准的。

假设您有proc创建的流程subprocess.Popenproc具有stdinstdout属性。这些属性只是文件类对象。因此,为了通过stdin发送信息,您可以致电proc.stdin.write()。要从proc.stdout检索信息,您可以致电proc.stdout.readline()来阅读单独的一行。

有几点需要注意:

  • 通过proc.stdin写入write()时,您需要使用换行符结束输入。如果没有换行符,您的子进程将挂起,直到传递换行符。
  • 为了从proc.stdout读取信息,您需要确保子进程调用的命令在每个print语句之后正确刷新其stdout缓冲区,并且每行以换行符结束。如果stdout缓冲区在适当的时间没有刷新,则对proc.stdout.readline()的调用将挂起。

答案 1 :(得分:1)

我认为你自己会很好(小心)忽略使用Popen.stdin等的警告。只需确保逐行处理流并按公平计划迭代它们,以免填满任何缓冲区。在Python中执行此操作的一种相对简单(且低效)的方法是为三个流使用单独的线程。这就是Popen.communicate在内部的作用。查看其源代码以了解具体方法。