如何在Python中打印到stderr?

1758 投票
17 回答
1255585 浏览
提问于 2025-04-16 15:14

有几种方法可以向错误输出(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)

这些方法有什么区别呢?我们应该选择哪种方法呢?

17 个回答

392

Python 3:

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

Python 2:

print >> sys.stderr, "fatal error"

详细解答

在Python 3中,print >> sys.stderr这个用法不再存在了。http://docs.python.org/3.0/whatsnew/3.0.html上说:

以前的写法:print >> sys.stderr, "fatal error"
现在的写法:print("fatal error", file=sys.stderr)

对很多人来说,把输出的目标放在命令的最后感觉有点不习惯。另一种写法

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

看起来更像面向对象的风格,从一般到具体的表达方式也更优雅。不过要注意,write并不能完全替代print

656
import sys
sys.stderr.write()

这是我的选择,它更容易读懂,并且准确表达了你的意图,而且在不同版本之间也能通用。

补充一下:对我来说,所谓“pythonic”并不是最重要的,阅读性和性能才是更优先考虑的事情……考虑到这两点,在Python中,你的80%的代码都会是“pythonic”的。列表推导式是一个不那么常用的“重要特性”(因为它的可读性)。

1557

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

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

撰写回答