Python PIPEd出标准输入

Python PIPEd出标准输入,第1张

Python PIPEd出标准输入

首先,显然您需要添加

stdin=subprocess.PIPE
Popen
构造函数中,然后您就可以
process.stdin.write
像一样了
process.stdout.read

但是很明显,

read
如果没有数据,则
write
可以阻止,如果孩子没有阅读,则可以阻止。

甚至不只是显而易见的事实,要在双向

Popen
程序中正确使用双向交互的PIPE且不阻塞任何地方,实际上也很难做到。如果您确实想要这样做,请查看源
communicate
以了解其工作原理。(3.2之前存在一些已知的错误,因此,如果您使用的是2.x,则可能需要进行一些反向移植。)您将必须自己实现代码,并且如果希望跨平台,则需要将不得不做
communicate
内部的整个混乱(生成管道的读取器和写入器线程等),当然还要添加另一个线程以在每次尝试通信时不阻塞主线程,以及某种消息传递机制孩子准备好后的主线程,依此类推。

另外,您可以查看PyPI上的各种“异步子流程”项目。我今天所知道的最简单的方法是

async_subprocess
,它基本上只是为您提供了一个
communicate
可以不受阻碍使用的方法。

或者,如果可以使用

twisted
(或可能使用其他基于事件的网络框架),则子进程周围会有包装器插入到其事件循环中。(如果您可以等待Python
3.4或
tulip
在3.3上使用正在进行的工作,则有人在构建类似的东西后
tulip
可能会将其集成到3.4中。)
twisted
甚至知道如何插入
Tkinter
,因此您不必手动处理两个单独的事件循环并在它们之间进行通信。

如果您只关心现代POSIX系统(而不是Windows),则可以通过将管道置于非阻塞模式并像处理套接字一样编写代码来简化 *** 作。

但是最简单的解决方案可能是使用类似的东西,

pexpect
而不是尝试手动编写脚本。(正如JF
Sebastian指出的那样,
pexpect
它仅
pexpect
适用于Unix
,但您可以在Unix和
winpexpect
Windows周围使用包装器。)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存