2013-12-05 3 views
2

есть ли «хороший» способ перебора вывода команды оболочки?Python: Хороший способ перебора результата команды оболочки

Я ищу питона эквивалент чего-то вроде:

ls | while read file; do 
    echo $file 
done 

Обратите внимание, что «LS» является только примером для команды оболочки, которая будет возвращать его результат в нескольких строках и причины «эхо» просто: что-то с этим делать.

Я знаю об этих альтернативах: Calling an external command in Python, но я не знаю, какой из них использовать, или если есть более «приятное» решение. (На самом деле «лучше» является основным направлением этого вопроса.)

Это для замены некоторых скриптов bash на python.

+2

остерегаться [блока буферизации вопроса] (http://stackoverflow.com/q/20503671/4279) и [методы исправления] (http://stackoverflow.com/a/20509641/4279) – jfs

ответ

8

вы можете открыть трубу (см doc):

import os 

with os.popen('ls') as pipe: 
    for line in pipe: 
     print (line.strip()) 

как в документе этот синтаксис амортизируется и заменяется более сложным subprocess.Popen

from subprocess import Popen, PIPE 
pipe = Popen('ls', shell=True, stdout=PIPE) 

for line in pipe.stdout: 
    print(line.strip()) 
+0

drop 'shell = True'. Здесь нет необходимости. – jfs

+1

@ J.F.Sebastian необходимость 'shell = True' зависит от сценариев bash, которые OP должен заменить; для команд так же просто, как 'ls ~', необходимо передать 'shell = True' –

0

check_output вернет вам строку, которую вы можете проанализировать. call просто повторит использование существующего stdout/stderr/stdin и просто вернет код выхода процесса.

Смежные вопросы