从子进程读取stdout直到没有任何东西

时间:2015-07-29 18:54:19

标签: python subprocess stdout popen readline

我想在同一个shell中运行几个命令。经过一些研究后,我发现我可以使用Popen的返回过程打开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循环?

2 个答案:

答案 0 :(得分:1)

使用iter实时读取数据:

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

如果你只想写入stdin并获得输出,你可以使用通信来结束进程:

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"])

答案 1 :(得分:1)

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

您可以将exit写入stdin以使其退出,但请注意,无论如何,您都可以阅读stdout所不需要的内容。例如提示。

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