从python subprocess.Popen中捕获stderr

4 投票
2 回答
17412 浏览
提问于 2025-04-15 11:51

我在这里看到很多人提到这个问题,但还是没能从命令中捕捉到故意的错误。我找到的最好的一部分工作代码是这样的……

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

撰写回答