4

我在这里看过很多次这个帖子;但未能从命令中捕获故意错误。到目前为止我发现的最好的部分工作..

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()
4

2 回答 2

8

这对我来说非常有效:

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
于 2014-06-11T20:03:47.940 回答
2

您是否 100% 确定“datdsade”实际上会写入标准错误?如果是这样,那么它可能正在缓冲它的标准错误,或者阻塞它。

编辑:我建议在 bash 中运行“datdsade”(你的程序)(假设你有 linux,你可以为 windows 使用 dl sh.exe),看看你是否可以将你的 stderr 捕获到一个文件 datdsade 2> errors.txt。请注意,如果您在 Windows 上,stderr 将不会在 DOS 窗口中输出。您可能会更幸运地先写入日志文件并将其读回或让 python 将其存储在变量中。

或者 stderr=sub.STDOUT 会将您的错误与标准输出合并。

再次编辑:忽略上述内容,因为communicate() 正在捕获所有这些。我会说问题肯定是您选择的程序永远不会写入stderr,或者您实际上并没有触发错误。这就是程序的编写方式。程序是什么?

于 2009-05-27T06:56:31.617 回答