如何从subprocess.Popen.stdout(非阻塞)读取所有可用数据?

我需要一种方法来读取Popen创建的流中所有当前可用的字符,或者找出缓冲区中还剩下多少个字符。

背景:我想用Python远程控制一个交互式应用程序。到目前为止,我已经使用Popen创建了一个新的子进程:

process=subprocess.Popen(["python"],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, cwd=workingDir)

(我并不是真正开始使用python,但是实际的交互界面是相似的。)此刻,我读取了1个字节,直到检测到进程已到达命令提示符:

output = ""

while output[-6:]!="SCIP> ":

output += process.stdout.read(1)

sys.stdout.write(output[-1])

return output

然后,我通过进行冗长的计算process.stdin.write("command\n")。我的问题是,由于无法检查流中的最后一个字符是否是提示,因此无法检查计算是否已完成。read()read(n)阻塞我的线程,直到到达EOF(永远不会),因为交互式程序直到被告知后才会结束。以上述循环的方式查找提示也不起作用,因为提示只会在计算之后出现。

理想的解决方案是让我从流中读取所有可用字符,如果没有要读取的内容,则立即返回空字符串。

回答:

随便看看,我发现这个非常好的解决方案

持久python子进程

通过使用fcntl将子进程管道上的文件属性设置为非阻塞模式,从而避免了阻塞问题,不需要辅助线程或轮询。我可能会丢失一些东西,但是它解决了我的交互式过程控制问题。

以上是 如何从subprocess.Popen.stdout(非阻塞)读取所有可用数据? 的全部内容, 来源链接: utcz.com/qa/405471.html

回到顶部