从子进程中读取标准输出,直到什么都没有

Read stdout from subprocess until there is nothing left

我想 运行 在同一个 shell 中执行多个命令。经过一些研究,我发现我可以使用 Popen 中的 return 进程保持 shell 打开。然后我可以写入和读取 stdinstdout。我尝试这样实现它:

process = Popen(['/bin/sh'], stdin=PIPE, stdout=PIPE)
process.stdin.write('ls -al\n')
out = ' '
while not out == '':
    out = process.stdout.readline().rstrip('\n')
    print out

我的解决方案不仅丑陋,而且行不通。 out 永远不会为空,因为它传递给 readline()。当没有任何内容可读时,如何成功结束 while 循环?

使用iter实时读取数据:

for line in iter(process.stdout.readline,""):
   print line

如果您只想写入 stdin 并获得输出,您可以使用 communicate 使进程结束:

process = Popen(['/bin/sh'], stdin=PIPE, stdout=PIPE)
out,err =process.communicate('ls -al\n')

或者简单地使用 check_output:

获取输出
from subprocess import check_output

out = check_output(["ls", "-al"])

您在子进程中 运行 的命令是 sh,因此您正在阅读的输出是 sh 的输出。由于您没有向 shell 指示它应该退出,它仍然存在,因此它的标准输出仍然打开。

您或许可以将 exit 写入其 stdin 以使其退出,但请注意,无论如何,您都可以从其 [=14= 中读取不需要的内容],例如提示。

最重要的是,这种方法有缺陷...