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

其他回答

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

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

我发现这是唯一一个简短、灵活、便携和可读的:

import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

可选函数eprint可以节省一些重复。它可以以与标准打印功能相同的方式使用:

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz

我这样做只是为了好玩,但这里有另一种方式…:-)

message = 'error: Belly up!!'
print(message, file=sys.stderr if 'error' in message.lower() else sys.stdout)
import sys
sys.stderr.write()

是我的选择,只是更具可读性,更准确地说出您想要做的事情,并且可以跨版本移植。

编辑:在可读性和性能方面,“蟒蛇”是我的第三个想法。。。考虑到这两件事,使用python,80%的代码将是pythonic的。列表理解是不经常使用的“大事”(可读性)。

这同样适用于标准输出:

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

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

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