有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
当前回答
如果由于严重错误而要退出程序,请使用:
sys.exit("Your program caused a fatal error. ... description ...")
并在标头中导入sys。
其他回答
Python 3:
print("fatal error", file=sys.stderr)
Python 2:
print >> sys.stderr, "fatal error"
答案很长
print>>sys.stderr已在Python3中消失。http://docs.python.org/3.0/whatsnew/3.0.html说:
旧:print>>sys.stderr,“致命错误”新建:打印(“致命错误”,文件=sys.stderr)
对我们中的许多人来说,将目的地归为指挥的终点,感觉有些不自然。替代方案
sys.stderr.write("fatal error\n")
看起来更面向对象,从通用到特定都很优雅。但请注意,书写并不是打印的1:1替代。
这将模拟标准打印函数,但输出到stderr
def print_err(*args):
sys.stderr.write(' '.join(map(str,args)) + '\n')
我在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(它还会去哪里?)之外,它还是有效的。
我这样做只是为了好玩,但这里有另一种方式…:-)
message = 'error: Belly up!!'
print(message, file=sys.stderr if 'error' in message.lower() else sys.stdout)
我发现这是唯一一个简短、灵活、便携和可读的:
import sys
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
可选函数eprint可以节省一些重复。它可以以与标准打印功能相同的方式使用:
>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz