захватить stderr из подпроцесса python.Popen (команда, stderr = subprocess.PIPE, stdout = subprocess.PIPE) - PullRequest
4 голосов
/ 27 мая 2009

Я видел это много раз здесь; пока не удалось зафиксировать преднамеренные ошибки от команды. Лучшая частичная работа, которую я нашел до сих пор ..

from Tkinter import *
import os
import Image, ImageTk
import subprocess as sub
p = sub.Popen('datdsade',stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()

root = Tk()
text = Text(root)
text.pack()
text.insert(END, output+ "Error: " + errors )
root.mainloop()

Ответы [ 2 ]

7 голосов
/ 12 июня 2014

Это прекрасно работает для меня:

import subprocess
try:
    #prints results
    result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True)
    print result
    #causes error
    result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError, ex:
    print "--------error------"
    print ex.cmd
    print ex.message
    print ex.returncode
    print ex.output
2 голосов
/ 27 мая 2009

Вы на 100% уверены, что datdsade действительно пишет в stderr? Если это так, то, возможно, он буферизует свой stderr или блокирует его.

РЕДАКТИРОВАТЬ: Я бы предложил запустить 'datdsade' (вашу программу) в bash (при условии, что у вас есть linux, вы можете использовать dl sh.exe для Windows) и посмотреть, сможете ли вы записать свой stderr в файл datdsade 2> ошибки. текст. Помните, что , если вы используете Windows, stderr не будет выводить в окне DOS . Возможно, вам больше повезет: сначала вы записываете в файл журнала и читаете его обратно, либо Python сохраняет его в переменной.

В качестве альтернативы stderr = sub.STDOUT объединит ваши ошибки со стандартным выводом.

ВНОВЬ РЕДАКТИРОВАТЬ: Игнорируйте вышеизложенное, так как Communication () захватывает все это. Я бы сказал, что проблема определенно в том, что выбранная вами программа никогда не пишет в stderr или вы фактически не вызываете ошибку. Это просто способ, которым была написана программа. Что такое программа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...