如何在python中将std.error写入文件,而将std.out写入控制台?

如何在python中将std.error写入文件,而将std.out写入控制台?,python,exception,try-catch,stderr,Python,Exception,Try Catch,Stderr,在本例中,我想在try块中写入console std.out; 但是,当except块抛出异常时,我想将异常内容写入std.err,它将被重新定向到日志文件 我可以在块中打开一个文件,然后在上面写。但是对于每个try-catch块都需要这样做,因此如果有其他方法可以将这些异常重新定向到std.err并记录std.error >>> try: ... print "hello world" ... 1/0 ... except ZeroDivisionError as e

在本例中,我想在try块中写入console std.out; 但是,当except块抛出异常时,我想将异常内容写入std.err,它将被重新定向到日志文件

我可以在块中打开一个文件,然后在上面写。但是对于每个try-catch块都需要这样做,因此如果有其他方法可以将这些异常重新定向到std.err并记录std.error

>>> try:
...   print "hello world"
...   1/0
... except ZeroDivisionError as e:
...   print "exception"
... 
hello world
exception

绝对有可能:

import sys
sys.stderr = open("/tmp/errors.txt", "w")
下面所有打印到stderr的文件都会被保存到该文件中


不过,您可能应该在shell级别而不是Python级别执行此操作-它更灵活。

如果要打印到stderr,请使用sys.stderr,并让操作系统和用户处理打印到std.err的文本。这允许用户在Posix终端上运行python your_script.py 2>my_err_输出,并且仍然捕获std.err内容

如果要将日志信息输出到特定文件,请改为


不要修改一个非常标准的概念的行为-那将是错误的。正确的日志记录允许您捕获所需的信息,但允许通过管道传输到stderr的预期回溯到用户,而无需找到您的特殊文件。

我没有投票,但当您向stdout写入内容时,我无法了解问题的头绪,这会导致其他输出被重定向到stderr???@NPE:我正在重新格式化问题。@legostrmtropr:我知道这张打印>>sys.stderr,“垃圾邮件”。但我想知道我是否可以将所有sys.stderr重新定向到一个文件,而不是将其默认定向到控制台。这可能会产生不必要的副作用,即通过管道将所有异常回溯传递到询问者试图打印到的文件中,从而使其静音。OP确实询问了如何将所有stderr重定向到一个文件。但是我同意——就像我说的,这是个坏主意,在shell级别做得更好。@MaxNoel:谢谢你的解决方案。至少我知道这是可能的,但我不会这么做,汉克斯。将遵循黄金法则@渴望学习你也可以遵循金科玉律,将答案标记为帮助他人的答案;