我需要从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',...]
问题: 如何使用第一种方法(没有文件操作,所有程序内部)和第二种方法的结果?
答案 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中的一个类型。请尝试使用lst
或list1
。
您还可以将其简化为:
#!/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