如何在Python中打印到stderr?

2024-03-28 21:01:33 发布

您现在位置:Python中文网/ 问答频道 /正文

有几种方法可以写入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的禅宗格格不入,那么这里的区别是什么,有什么优点或缺点吗?应该用哪种方法?

应该有一种——最好只有一种——显而易见的方法来做到这一点。


Tags: 方法inosstderrsysnotspamthis
3条回答
import sys
sys.stderr.write()

是我的选择,只是更可读,说的正是你打算做什么和跨版本移植。

编辑:对我来说,成为“Python”是第三个超越可读性和性能的想法。。。考虑到这两件事,使用python,80%的代码将是pythonic代码。列表理解是一个“重要的东西”,不经常使用(可读性)。

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

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

print >> sys.stderr在Python3中消失了。 http://docs.python.org/3.0/whatsnew/3.0.html说:

Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

对我们中的许多人来说,把目的地降到命令的末尾有点不自然。另一种选择

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

看起来更加面向对象,并且优雅地从一般到特定。但是请注意write不是print的1:1替换。

相关问题 更多 >