Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中读取开放子进程的标准输出数据_Python - Fatal编程技术网

在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

我可以用Python打开一个子进程并向它发送一些数据,例如

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...