有几种方法可以写入stderr:

print >> sys.stderr, "spam"  # Python 2 only.

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

这些方法之间有什么区别?应首选哪种方法?


当前回答

如果由于严重错误而要退出程序,请使用:

sys.exit("Your program caused a fatal error. ... description ...")

并在标头中导入sys。

其他回答

另一种方式

import sys
print("{}".format(sys.exec_info()[1], file=sys.stderr)

如果进行简单测试:

import time
import sys

def run1(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        print >> sys.stderr, 'X'
    elapsed = (time.time()-cur)
    return elapsed

def run2(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        sys.stderr.write('X\n')
        sys.stderr.flush()
    elapsed = (time.time()-cur)
    return elapsed

def compare(runs):
    sum1, sum2 = 0, 0
    x = 0
    while x < runs:
        x += 1
        sum1 += run1(runs)
        sum2 += run2(runs)
    return sum1, sum2

if __name__ == '__main__':
    s1, s2 = compare(1000)
    print "Using (print >> sys.stderr, 'X'): %s" %(s1)
    print "Using (sys.stderr.write('X'),sys.stderr.flush()):%s" %(s2)
    print "Ratio: %f" %(float(s1) / float(s2))

你会发现sys.stderr.write()总是快1.81倍!

这将模拟标准打印函数,但输出到stderr

def print_err(*args):
    sys.stderr.write(' '.join(map(str,args)) + '\n')

对于Python 2,我的选择是:print>>sys.stderr,“垃圾邮件”因为您可以简单地打印列表/字典等,而无需将其转换为字符串。print>>sys.stderr,{'spam':'spam'}而不是:sys.stderr.write(str({'spam':'spam'}))

还没有人提到日志记录,但日志记录是专门为传递错误消息而创建的。基本配置将设置写入stderr的流处理程序。

此脚本:

# foo.py
import logging

logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')
print('hello world')

在命令行上运行时具有以下结果:

$ python3 foo.py > bar.txt
I print to stderr by default

bar.txt将包含打印在stdout上的“helloworld”。