从python subprocess.Popen中捕获stderr
我在这里看到很多人提到这个问题,但还是没能从命令中捕捉到故意的错误。我找到的最好的一部分工作代码是这样的……
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 个回答
2
你确定 'datdsade' 真的会把信息写到错误输出(stderr)吗?如果确定的话,可能是它在缓存错误输出,或者在等待某些东西。
补充一下:我建议你在 bash 中运行 'datdsade'(假设你用的是 Linux,如果是 Windows,可以下载 sh.exe),看看能不能把错误输出保存到一个文件里,命令是 datdsade 2> errors.txt。要注意的是,如果你在 Windows 上,错误输出不会在 DOS 窗口中显示。你可能更容易先把信息写入日志文件,然后再读取,或者让 Python 把它存到一个变量里。
另外,你可以用 stderr=sub.STDOUT 这个方法,把错误信息和正常输出合并在一起。
再补充一下:上面的建议可以忽略,因为 communicate() 已经捕获了所有这些信息。我认为问题肯定是你选择的程序根本没有写入错误输出,或者你并没有真正触发错误。这就是这个程序的写法。这个程序是什么呢?
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