有几种方法可以写入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)

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


当前回答

我使用Python 3执行了以下操作:

from sys import stderr

def print_err(*args, **kwargs):
    print(*args, file=stderr, **kwargs)

因此,现在我可以添加关键字参数,例如,以避免回车:

print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")

其他回答

如果进行简单测试:

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倍!

这同样适用于标准输出:

print 'spam'
sys.stdout.write('spam\n')

如其他答案所述,打印提供了一个漂亮的界面,通常更方便(例如,用于打印调试信息),而写入速度更快,并且在必须以某种方式精确格式化输出时也更方便。我也会考虑可维护性:

您可以稍后决定在stdout/stderr和常规文件之间切换。print()语法在Python3中发生了变化,因此如果您需要同时支持这两个版本,write()可能会更好。

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

另一种方式

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

Python 3:

print("fatal error", file=sys.stderr)

Python 2:

print >> sys.stderr, "fatal error"

答案很长

print>>sys.stderr已在Python3中消失。http://docs.python.org/3.0/whatsnew/3.0.html说:

旧:print>>sys.stderr,“致命错误”新建:打印(“致命错误”,文件=sys.stderr)

对我们中的许多人来说,将目的地归为指挥的终点,感觉有些不自然。替代方案

sys.stderr.write("fatal error\n")

看起来更面向对象,从通用到特定都很优雅。但请注意,书写并不是打印的1:1替代。