wim*_*wim 1246 python printing stderr zen-of-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)
Run Code Online (Sandbox Code Playgroud)
这似乎与Python#13 †的禅宗相矛盾,那么这里有什么区别,这种方式有哪些优点或缺点?应该使用哪种方式?
† 应该有一个 - 最好只有一个 - 显而易见的方法.
Mar*_*rcH 1076
我发现这是唯一一个短+灵活+便携+可读:
from __future__ import print_function
import sys
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
Run Code Online (Sandbox Code Playgroud)
该功能eprint可以与标准print功能相同的方式使用:
>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz
Run Code Online (Sandbox Code Playgroud)
Mik*_*rez 514
import sys
sys.stderr.write()
Run Code Online (Sandbox Code Playgroud)
是我的选择,只是更具可读性,并准确地说明您打算做什么,并且可以跨版本移植.
编辑:成为'pythonic'是第三个想到我的可读性和性能......考虑到这两件事,python 80%的代码将是pythonic.列表理解是不经常使用的"大事"(可读性).
Joa*_*m W 139
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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这非常难看.或者,使用
sys.stderr.write("fatal error\n")
Run Code Online (Sandbox Code Playgroud)
但请注意,这write不是1:1的替代品print.
Fra*_*dan 129
对于Python 2,我的选择是:
print >> sys.stderr, 'spam'
因为您可以简单地打印列表/ dicts等而不将其转换为字符串.
print >> sys.stderr, {'spam': 'spam'}
代替:
sys.stderr.write(str({'spam': 'spam'}))
slu*_*shy 107
还没logging有人提到过,但是专门为了传递错误消息而创建了日志记录.默认情况下,它设置为写入stderr.这个脚本:
# foo.py
import logging
logging.basicConfig(format='%(message)s')
logging.warning('I print to stderr by default')
logging.info('For this you must change the level and add a handler.')
print('hello world')
Run Code Online (Sandbox Code Playgroud)
在命令行上运行时,结果如下:
$ python3 foo.py > bar.txt
I print to stderr by default
Run Code Online (Sandbox Code Playgroud)
(和bar.txt包含'hello world')
(注意,logging.warn已被弃用,请logging.warning改用)
Car*_* F. 31
我会说你的第一个方法:
print >> sys.stderr, 'spam'
Run Code Online (Sandbox Code Playgroud)
是"一个...... 显而易见的方式"其他人不满足规则#1("美丽胜过丑陋.")
aag*_*rre 31
我使用Python 3做了以下事情:
from sys import stderr
def print_err(*args, **kwargs):
print(*args, file=stderr, **kwargs)
Run Code Online (Sandbox Code Playgroud)
所以现在我可以添加关键字参数,例如,以避免回车:
print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")
Run Code Online (Sandbox Code Playgroud)
小智 19
这将模仿标准打印功能,但在stderr上输出
def print_err(*args):
sys.stderr.write(' '.join(map(str,args)) + '\n')
Run Code Online (Sandbox Code Playgroud)
Reb*_*ebs 16
编辑在后视中,我认为改变sys.stderr并且没有看到行为更新的潜在混淆使得这个答案不如使用其他人指出的简单函数那么好.
使用partial只能为您节省1行代码.潜在的混淆不值得保存1行代码.
原版的
为了使它更容易,这里是一个使用'partial'的版本,这对包装函数有很大帮助.
from __future__ import print_function
import sys
from functools import partial
error = partial(print, file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
然后你就这样使用它
error('An error occured!')
Run Code Online (Sandbox Code Playgroud)
您可以通过执行以下操作来检查它是否打印到stderr而不是stdout(来自http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and的代码).html):
# over-ride stderr to prove that this function works.
class NullDevice():
def write(self, s):
pass
sys.stderr = NullDevice()
# we must import print error AFTER we've removed the null device because
# it has been assigned and will not be re-evaluated.
# assume error function is in print_error.py
from print_error import error
# no message should be printed
error("You won't see this error!")
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是在创建时将sys.stderr的值分配给包装函数.这意味着,如果您稍后重定向stderr,它将不会影响此功能. 如果您打算重定向stderr,请使用此页面上aaguirre提到的**kwargs方法.
Flo*_*ane 11
在Python 3中,可以只使用print():
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Run Code Online (Sandbox Code Playgroud)
几乎开箱即用:
import sys
print("Hello, world!", file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
要么:
from sys import stderr
print("Hello, world!", file=stderr)
Run Code Online (Sandbox Code Playgroud)
这很简单,不需要除以外的任何内容sys.stderr。
这同样适用于stdout:
print 'spam'
sys.stdout.write('spam\n')
Run Code Online (Sandbox Code Playgroud)
正如其他答案中所述,print提供了一个漂亮的界面,通常更方便(例如,用于打印调试信息),而写入更快,并且当您必须以某种方式精确地格式化输出时也可以更方便.我也会考虑可维护性:
您可能稍后决定在stdout/stderr和常规文件之间切换.
print()语法在Python 3中已经改变,所以如果你需要支持这两个版本,write()可能会更好.
我在python 3.4.3中工作.我正在切出一个小小的打字,显示我是如何到达这里的:
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ python3
>>> import sys
>>> print("testing", file=sys.stderr)
testing
>>>
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$
Run Code Online (Sandbox Code Playgroud)
它有用吗?尝试将stderr重定向到文件,看看会发生什么:
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ python3 2> /tmp/test.txt
>>> import sys
>>> print("testing", file=sys.stderr)
>>> [18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ cat /tmp/test.txt
Python 3.4.3 (default, May 5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
testing
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
Run Code Online (Sandbox Code Playgroud)
好吧,除了python给你的小介绍已经悄悄进入stderr(它还会去哪里?)之外,它的确有效.
如果您想因致命错误而退出程序,请使用:
sys.exit("Your program caused a fatal error. ... description ...")
Run Code Online (Sandbox Code Playgroud)
并import sys在标题中。
| 归档时间: |
|
| 查看次数: |
767220 次 |
| 最近记录: |