在Python中读取开放子进程的标准输出数据
我可以用Python打开一个子进程并向它发送一些数据,例如在Python中读取开放子进程的标准输出数据,python,Python,我可以用Python打开一个子进程并向它发送一些数据,例如 process = subprocess.Popen( ["bash"], stdout = subprocess.PIPE, stdin = subprocess.PIPE ) process.stdin.write( b"echo hello\n" ) 但是,我在接收数据时遇到问题。 通常我会使用以下方法: for line in process.stdout: ...do some
process = subprocess.Popen( ["bash"], stdout = subprocess.PIPE, stdin = subprocess.PIPE )
process.stdin.write( b"echo hello\n" )
但是,我在接收数据时遇到问题。
通常我会使用以下方法:
for line in process.stdout:
...do something...
但由于进程仍然处于打开状态,它仍在生成数据,因此line
在stdout
实际获取数据之前是空的,并且循环在开始之前退出。类似地,我不能使用process.communicate
,因为虽然它确实获得了数据,但它这样做只是因为它等待进程退出
我当然可以投票,例如,这确实有效:
然而,轮询非常消耗资源!
有更好的(跨平台)替代方案吗?我希望
readline
会一直阻塞,直到有一行数据可用,或者直到流关闭。你确定没有从另一个进程返回的空行吗?正如Steve所说--对于进程中的行。stdout:
将等待直到有一行可用;它唯一退出的时间是stdout
已关闭。如果进程仍在运行且尚未写入任何输出,则它不会退出,除非该进程实际关闭了其标准输出。此外,line=process.stdout.readline()
也不应是轮询操作,应该阻塞,直到有真正准备好读取的东西——除非有东西在文件描述符上实际设置了非阻塞标志;但是,如果您正在做类似的事情,那么它确实需要包含在问题的代码中。
while True:
line = process.stdout.readline()
if line:
...do something...