从子进程中读取标准输出,直到什么都没有
Read stdout from subprocess until there is nothing left
我想 运行 在同一个 shell 中执行多个命令。经过一些研究,我发现我可以使用 Popen
中的 return 进程保持 shell 打开。然后我可以写入和读取 stdin
和 stdout
。我尝试这样实现它:
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= 中读取不需要的内容],例如提示。
最重要的是,这种方法有缺陷...
我想 运行 在同一个 shell 中执行多个命令。经过一些研究,我发现我可以使用 Popen
中的 return 进程保持 shell 打开。然后我可以写入和读取 stdin
和 stdout
。我尝试这样实现它:
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= 中读取不需要的内容],例如提示。
最重要的是,这种方法有缺陷...