首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python命令(subprocess.Popen,stderr=subprocess.PIPE,stdout=subprocess.PIPE)捕获stderr

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

Stack Overflow用户
提问于 2009-05-27 06:51:33
回答 2查看 16.9K关注 0票数 4

我在这里看到过很多次这样的帖子,但却未能捕捉到来自命令的故意错误。到目前为止我找到的最好的部分作品..

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2014-06-12 04:03:48

这对我来说非常有效:

代码语言:javascript
复制
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
票数 8
EN

Stack Overflow用户

发布于 2009-05-27 06:56:32

你100%确定'datdsade‘真的写到stderr了吗?如果是这样,那么它可能正在缓冲它的stderr,或者阻塞它。

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

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

再次编辑:忽略上面的内容,因为communicate()捕获了所有这些内容。我会说,问题很明显是你选择的程序从来没有写入stderr,或者你实际上没有触发一个错误。这就是程序的编写方式。计划是什么?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/914320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档