2009-05-27 5 views
4

Я видел, как это выкладывалось много раз здесь; но не удалось зафиксировать умышленные ошибки из команды. Лучшая частичная работа, которую я нашел до сих пор.захват stderr из подпроцесса python.Popen (команда, stderr = subprocess.PIPE, stdout = subprocess.PIPE)

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() 
+1

Спасибо за ваш ответ косяк на месте. Для ясности "PyMOTW: подпроцесс Дуг Hellmann" здесь [http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html] из Tkinter импорта * импорта подпроцесса прок = подпроцесса .Popen ('TestSomeCommandThatDoesNotExisit', оболочки = True, STDIN = subprocess.PIPE, стандартный вывод = subprocess.PIPE, STDERR = subprocess.STDOUT,) stdout_value, stderr_value = proc.communicate() корень = Тк() = текст Текст (корень) text.pack() text.insert (END, repr (stdout_value)) root.mainloop() Я не сливал stderr = sub.STDOUT Еще раз спасибо ombre :) ~ nolo – 2009-05-28 20:02:49

ответ

2

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

EDIT: Я бы предложил запустить «datdsade» (ваша программа) в bash (если у вас есть Linux, вы можете dl sh.exe для Windows) и посмотреть, можете ли вы захватить stderr в файл datdsade 2> errors .текст. Имейте в виду, что , если вы находитесь на Windows, stderr не будет выводиться в окне DOS. Возможно, вам больше повезло записать в файл журнала и прочитать его обратно или оставить python в переменной.

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

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

+0

что бы вы предложили? потратил немало времени на чтение; но большинство указывает на устаревшее использование. o.spawn и т. д. заранее спасибо :) – 2009-05-27 21:31:04

5

Это отлично работает для меня:

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