2013-08-08 2 views
2

версии Python: "2.6.5 (R265: 79063, 1 октября 2012, 22:07:21) \ п [GCC 4.4.3]с использованием метода subprocess.call

У меня есть это:

>>> ss = subprocess.call("ls -z", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Как получить сообщение об ошибке сейчас?

Это не работает:

>>> for i in subprocess.PIPE: 
...  print i 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 
+1

Есть ли причина, по которой вы используете 'shell = True' и' 'ls -z" 'вместо' ["ls", "-z"] '? Это не относится к вашей проблеме, но, как правило, использование оболочки, когда вам не нужно, является плохой идеей, поскольку это передача команд и надеется, что вы получите право на побег, чтобы они разобрались в списке, который вы имели в виду. – abarnert

ответ

2

Это комбо вариантов не работает очень хорошо. Communicate() будет читать stdout, stderr и ждать завершения программы.

proc = subprocess.Popen("ls -z", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = proc.communicate() 
assert proc.returncode == 0, 'i am sad' 
print out 
print err 

Если вы хотите прочитать стандартный вывод построчно, как работает программа, вы можете создать свой собственный поток нянчить Stderr или трубы STDERR на стандартный вывод.

+0

Я знаю, что мог бы Попен. Мне было интересно, как я буду делать то, что хочу делать с помощью только subprocess.call? – abc

+0

call() не дает вам доступа к трубам - его для случаев, когда вы хотите, чтобы пользователь видел вывод или вы подключались к файлу. его просто не правильный инструмент для работы, если вы хотите обработать выходные потоки. – tdelaney

+0

Это не объясняет фактическую ошибку. 'subprocess.PIPE' - это просто волшебная константа, которая сообщает, что функции' subprocess' «создают новый канал и используют его здесь», когда вы его передаете. (Это бывает -1, но это не важно.) Итак, повторение этой магической константы не принесет ничего полезного. – abarnert

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