从python subprocess.Popen捕获stderr(命令,stderr = subprocess.PIPE,stdout = subprocess.PIPE)

时间:2009-05-27 06:51:33

标签: python subprocess

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

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 个答案:

答案 0 :(得分:7)

这对我很有用:

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

答案 1 :(得分:2)

您是否100%确定'datdsade'实际写入stderr?如果是这样,那么它可能会缓冲它的stderr,或阻塞它。

编辑:我建议在bash中运行'datdsade'(你的程序)(假设你有linux,你可以用于Windows的sh.exe)并查看你是否可以将你的stderr捕获到文件datdsade 2> ERRORS.TXT。请注意,如果您使用的是Windows stderr,则不会在DOS窗口中输出。您可能有更多的运气写入日志文件并将其读回或让python将其存储在变量中。

或者stderr = sub.STDOUT会将你的错误与stdout合并。

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