逐行读取python的shell输出

时间:2015-03-11 17:43:36

标签: shell python-2.7

我需要从python脚本中读取shell命令输出并用每行填充一个列表:

ISSUE: 如果我将命令输出保存为变量,则循环周期将逐个字符地读取它

#!/usr/bin/python
import subprocess

CMD = "ls -la"
output = subprocess.check_output(CMD, shell=True)
list = []
for line in output:
    list.append(line)
print list

输出错误 ['' o',''' a',' l',' ',' 5',...]

解决方法: 作为一种解决方法,我将命令输出定向到一个文件,并从那里逐行读取:

#!/usr/bin/python
import subprocess

CMD = "ls -la > tmp"
subprocess.call(CMD, shell=True)
list = []
f = open("tmp", "r")
for line in f:
    list.append(line)
print list

良好的输出 ['总计52 \ n',' drwxrwxr-x 3 ajn ajn 4096 mars 11 17:52。\ n',...]

问题: 如何使用第一种方法(没有文件操作,所有程序内部)和第二种方法的结果?

3 个答案:

答案 0 :(得分:7)

我不是一个真正的蟒蛇人,但这对你有用,看起来更清晰:

import subprocess
cmd = ["ls", "-la"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in proc.stdout.readlines():
    print line

答案 1 :(得分:1)

您是否尝试过使用join?并在换行符\n)上使用split

#!/usr/bin/python
import subprocess

CMD = "ls -la"
output = subprocess.check_output(CMD, shell=True)
lst = []
for char in output:
    lst.append(char)
print ''.join(lst).split('\n')

基本上将所有输出连接到一个字符串中,然后在换行符上拆分以创建单个输出的列表。命名变量list也是不好的做法,因为这是Python中的一个类型。请尝试使用lstlist1

您还可以将其简化为:

#!/usr/bin/python
import subprocess

CMD = "ls -la"
output = subprocess.check_output(CMD, shell=True)
print output.split('\n')

由于subprocess.check_output()的返回值是单个字符串的输出,因此无需遍历每个字符,只需在字符串上使用split即可获得输出列表。

答案 2 :(得分:1)

@ glenn-jackman和@ tui-popenoe都回答:

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in proc.stdout.readlines():
    print line

output = subprocess.check_output(CMD, shell=True)
print output.split('\n')

但是,我使用 subprocess.Popen ,因为它对管道非常有用:

p1 = subprocess.Popen(['ip','-la'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep','afile'], stdin=p1.stdout,stdout=subprocess.PIPE)
p3 = subprocess.Popen(['awk','{ print $6; }'], stdin=p2.stdout,stdout=subprocess.PIPE)

output = p3.communicate()[0]

for ln in output.split('\n'):
    print ln