从Python subprocess.Popen命令中捕获标准错误(stderr),使用stderr=subprocess.PIPE, stdout=subprocess.PIPE参数。

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

1
谢谢你的回答,SpliFF说得没错。为了清楚起见,这里是Doug Hellmann关于"PyMOTW: subprocess"的文章链接:[http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html]从Tkinter导入* import subprocessproc = subprocess.Popen('TestSomeCommandThatDoesNotExisit', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout_value, stderr_value = proc.communicate()root = Tk() text = Text(root) text.pack() text.insert(END, repr(stdout_value)) root.mainloop()我之前没有合并stderr=sub.STDOUT 再次感谢,朋友 :)~nolo - undefined
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

2
你是否可以百分之百确定 'datdsade' 确实会写入 stderr?如果是这样,那么可能它正在缓冲其 stderr 或在其上阻塞。编辑:我建议在 bash 中运行 'datdsade'(您的程序)(假设您有 Linux,您可以为 Windows 下载 sh.exe),并查看是否可以将 stderr 捕获到文件 datdsade 2> errors.txt。请注意,如果您在 Windows 上,则 stderr 不会在 DOS 窗口中输出。您可以先写入日志文件并将其读回或让 Python 将其存储在变量中,这样可能会更加幸运。另外,stderr=sub.STDOUT 将合并您的错误和 stdout。再次编辑:忽略上述内容,因为 communicate() 正在捕获所有内容。我会说问题肯定是您选择的程序从不写入 stderr,或者您实际上没有触发错误。这就是程序编写的方式。这个程序是什么?

你有什么建议吗?我花了很多时间阅读,但大多数指向不推荐使用的用法,例如o.spawn等。先行致谢 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接