协慌网

登录 贡献 社区

如何在 Python 中打印到 stderr?

有几种方法可以写入 stderr:

# Note: this first one does not work in Python 3
 print >> sys.stderr, "spam"

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

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

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

这似乎与Python#13 †的 禅宗相矛盾,那么这里有什么区别,这种方式有哪些优点或缺点?应该使用哪种方式?

应该有一个 - 最好只有一个 - 显而易见的方法。

答案

我发现这是唯一一个短 + 灵活 + 便携 + 可读:

from __future__ import print_function
import sys

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

函数eprint可以与标准print功能相同的方式使用:

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz
import sys
sys.stderr.write()

是我的选择,只是更具可读性,并准确地说明您打算做什么,并且可以跨版本移植。

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

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