我有几种方法可以写入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†的禅相矛盾,那么首选方法是什么?这种或那种方式有任何优点或缺点吗?
†应该有一个 - 最好只有一个 - 显而易见的方法 .
15 回答
这将模仿标准打印功能,但在stderr上输出
print和stderr的写入函数之间的区别: stderr :stderr(标准错误)是内置于每个UNIX / Linux系统的管道,当程序崩溃并打印出调试信息(如Python中的回溯)时,它会转到stderr管 .
print :print是一个包装器,用于格式化输入(输入是参数和结尾处的换行符之间的空格),然后它调用给定对象的write函数,默认情况下给定的对象是sys.stdout,但是我们可以传递文件,即我们也可以在文件中打印输入 .
Python2:如果我们使用python2那么
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
对于 Python 2 ,我的选择是:
print >> sys.stderr, 'spam'
因为你可以简单地打印列表/ dicts等而不将其转换为字符串 .print >> sys.stderr, {'spam': 'spam'}
而不是:sys.stderr.write(str({'spam': 'spam'}))
是我的选择,只是更具可读性,并准确说明您打算做什么,并且可以跨版本移植 .
编辑:成为'pythonic'是第三个想到我的可读性和性能......考虑到这两个方面,python 80%的代码将是pythonic . 列表理解是不常用的“大事”(可读性) .
如果你做一个简单的测试:
你会发现sys.stderr.write()的速度始终是 1.81 倍!
pydoc日志记录
还没有人提到
logging
,但是专门为了传递错误消息而创建了日志记录 . 默认情况下,它设置为写入stderr . 这个脚本:在命令行上运行时,结果如下:
(和bar.txt包含'hello world')
(注意,
logging.warn
已deprecated,请改用logging.warning
)我使用Python 3做了以下事情:
所以现在我可以添加关键字参数,例如,以避免回车:
我在python 3.4.3中工作 . 我正在切出一个小小的打字,显示我是如何到达这里的:
它有用吗?尝试将stderr重定向到文件,看看会发生什么:
好吧,除了python给你的小介绍已经悄悄进入stderr(它还会去哪里?)之外,它有效 .
EDIT 在后视中,我认为改变sys.stderr并且没有看到行为更新的潜在混淆使得这个答案不如使用其他人指出的简单函数那么好 .
使用partial只能为您节省1行代码 . 潜在的混淆不值得保存1行代码 .
original
为了使它更容易,这里是一个使用'partial'的版本,这对包装函数有很大帮助 .
然后你就这样使用它
您可以通过执行以下操作来检查它是否正在打印到stderr而不是stdout(从http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and.html覆盖代码):
这样做的缺点是sys.stderr在创建时对包装函数的值是部分 assigns . 这意味着, if you redirect stderr later it won't affect this function. 如果您计划重定向stderr,请使用此页面上aaguirre提到的** kwargs方法 .
这同样适用于stdout:
正如其他答案所述,print提供了一个漂亮的界面,通常更方便(例如打印调试信息),当你必须以某种方式确切地格式化输出时,写入更快并且也更方便 . 我也会考虑可维护性:
399 print()语法在Python 3中已经改变,所以如果你需要支持这两个版本,write()可能会更好 .
print >> sys.stderr
在Python3中消失了 . http://docs.python.org/3.0/whatsnew/3.0.html说:不幸的是,这非常难看 . 或者,使用
但请注意
write
不是print
的1:1替代品 .我会说你的第一个方法:
是“一个...... obvious 这样做的方式" The others don't satisfy rule #1 ("美丽胜过丑陋 . ”)
尝试:
我发现这是唯一一个简短的灵活便携式可读:
函数
eprint
可以与标准print
函数相同的方式使用: