我想为另一个命令行程序制作一个Python包装器。
我希望尽快阅读Python stdin
,过滤并翻译它,然后将其及时写入子计划stdin
。
与此同时,我希望尽快从儿童计划stdout
中阅读,并在进行一些按摩后,立即将其写入Python {{1} }}
Python子进程模块充满了使用stdout
来避免死锁的警告。但是,communicate()
无法让我访问子计划communicate()
,直到孩子终止。
答案 0 :(得分:1)
免责声明:此解决方案可能要求您可以访问您尝试呼叫的流程的源代码,但无论如何都可能值得尝试。它取决于被调用的进程定期刷新其stdout
缓冲区,这是非标准的。
假设您有proc
创建的流程subprocess.Popen
。 proc
具有stdin
和stdout
属性。这些属性只是文件类对象。因此,为了通过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
在内部的作用。查看其源代码以了解具体方法。