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

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


当前回答

另一种方式

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

其他回答

另一种方式

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

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

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

我想说你的第一个方法是:

print >> sys.stderr, 'spam' 

是“一个……显而易见的方法”,其他人不满足规则1(“漂亮总比丑陋好”)

--2020年编辑--

以上是我在2011年对Python 2.7的回答。既然Python 3是标准,我认为“正确”的答案是:

print("spam", file=sys.stderr) 

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

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

在Python 3中,可以只使用print():

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

几乎开箱即用:

import sys
print("Hello, world!", file=sys.stderr)

or:

from sys import stderr
print("Hello, world!", file=stderr)

这很简单,不需要包含除sys.stderr之外的任何内容。