如何从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