有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
当前回答
我想说你的第一个方法是:
print >> sys.stderr, 'spam'
是“一个……显而易见的方法”,其他人不满足规则1(“漂亮总比丑陋好”)
--2020年编辑--
以上是我在2011年对Python 2.7的回答。既然Python 3是标准,我认为“正确”的答案是:
print("spam", file=sys.stderr)
其他回答
如果由于严重错误而要退出程序,请使用:
sys.exit("Your program caused a fatal error. ... description ...")
并在标头中导入sys。
我在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]$
它起作用了吗?尝试将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]$
好吧,除了python给你的小介绍已经被插入stderr(它还会去哪里?)之外,它还是有效的。
还没有人提到日志记录,但日志记录是专门为传递错误消息而创建的。基本配置将设置写入stderr的流处理程序。
此脚本:
# foo.py
import logging
logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')
print('hello world')
在命令行上运行时具有以下结果:
$ python3 foo.py > bar.txt
I print to stderr by default
bar.txt将包含打印在stdout上的“helloworld”。
我这样做只是为了好玩,但这里有另一种方式…:-)
message = 'error: Belly up!!'
print(message, file=sys.stderr if 'error' in message.lower() else sys.stdout)
这将模拟标准打印函数,但输出到stderr
def print_err(*args):
sys.stderr.write(' '.join(map(str,args)) + '\n')