如何在Python中打印到stderr?
有几种方法可以向错误输出(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