2015-03-11 2 views
0

мне нужно прочитать вывод команды оболочки из питона сценария и заполнить список с каждой линией:Чтение вывода оболочки из питона построчных линий

ВОПРОС: Если я сохранить вывод команды в качестве переменного , цикл петли читать символ за характером

#!/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 

Плохой выход: [ 'т', 'о', 'т', 'а', 'L', '', «5 ', ...]

РЕШЕНИЕ: В работе вокруг, я направил вывод COMAND в файл, а оттуда строку за строкой прочитать:

#!/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 \ п», 'drwxrwxr-х 3 Ajn Ajn 4096 марс 11 17:52 \ п.', ...]

ВОПРОС: Как я могу использовать 1-ый подход (без операции над файлами, все внутри программы) с результат второго подхода?

ответ

6

Я на самом деле не питон парень, но это должно работать для вас, и, кажется, немного яснее:

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

Вы пытались использовать join? И используйте split на новой строке (\n).

#!/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 на строке, чтобы получить список выходов.

1

Оба @ Glenn-Джекман и @ туй-Попено ответы работы:

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 
Смежные вопросы