2014-12-13 2 views
1

Я хочу знать, правильно ли закончен код subprocess.call() без какой-либо ошибки в вызываемой функции. Например, в коде ниже, если путь при условии, не подходит, то команда ls выдает ошибку, как:Как проверить, правильно ли завершен подпроцесс?

ERROR:No such file or directory.

Я хочу тот же результат будет храниться в виде строки.

import subprocess 
path = raw_input("Enter the path") 
subprocess.call(["ls","-l",path]) 
+1

подобный вопрос уже задавался. http://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call –

+0

@GeorgeSimms: Обычно вывод и статус выхода разные. Достаточно знать код возврата без извлечения подпроцесса 'stdout/stderr, чтобы проверить, правильно ли завершен субпроцесс, например, ненулевой статус выхода часто указывает ошибку (это зависит от подпроцесса), независимо от значения stdout/stderr. – jfs

+0

@JFSebastian автор спрашивает - о том, был ли подпроцесс успешным (что можно определить из фальшивости кода выхода) - выход подпроцесса в stdout/stderr как строку (которую можно получить, вызвав 'по результату Popen) ' subprocess.call' недостаточно, потому что вывод в stdout/stderr невозможен. В противном случае мы могли бы сделать 'something_went_wrong(), если subprocess.call (stuff) else we_are_ok()' –

ответ

1
from subprocess import Popen, PIPE 
p = Popen(["ls", "-l", path], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
output, err = p.communicate() 
status = p.returncode 
if status: 
    # something went wrong 
    pass 
else: 
    # we are ok 
    pass 

Хотя рассмотреть вопрос об использовании os.listdir

+0

Вам не нужно читать результат, чтобы проверить статус успеха. получить статус выхода; достаточно хранить 'subprocess.call()' возвращаемое значение (целое число). Ненулевой статус означает ошибку во многих случаях. Выход может быть перенаправлен на DEVNULL, чтобы избежать шума, например, 'stderr = DEVNULL'. – jfs

+0

@ J.F.Sebastian OP явно заявляет, что хочет прочитать результат. – BartoszKP

+0

@BartoszKP: Я знаю. Комментарий для людей, которые приземлились на странице из-за своего названия. – jfs

0

Вы не можете сделать это с call, потому что она делает это только:

Run the command described by args. Wait for command to complete, then return the returncode attribute.

Таким образом, вы можете определить только код возврата программы, которая обычно означает нуль, если ошибки не произошло, и ненулевое значение.

Используйте метод check_output из того же модуля:

try: 
    result = subprocess.check_output(["ls", "-l", path], 
            stderr = subprocess.STDOUT) 
    print result 
except subprocess.CalledProcessError, e: 
    print "Error:", e.output 

Вот working demo.

+0

Я не понимаю downvotes. Подход четко работает и использует метод, который документирован для этой цели. – BartoszKP

+0

возможно потому, что check_output не используется как вызов, вы должны использовать check_call –

+0

@PadraicCunningham. Вы не можете использовать 'check_call' здесь, потому что он не будет возвращать вывод как строку. Подобно 'call', он возвращает код ошибки. – BartoszKP

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