我想在同一个shell中运行几个命令。经过一些研究后,我发现我可以使用Popen
的返回过程打开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
循环?
答案 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
所不需要的内容。例如提示。
最重要的是,这种方法有缺陷,首先......