有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
当前回答
我使用Python 3执行了以下操作:
from sys import stderr
def print_err(*args, **kwargs):
print(*args, file=stderr, **kwargs)
因此,现在我可以添加关键字参数,例如,以避免回车:
print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")
其他回答
问题的答案是:在python中打印stderr有不同的方法,但这取决于1.)我们正在使用哪个python版本2.)我们想要的确切输出。
print和stderr的write函数之间的区别:stderr:stderr(标准错误)是内置在每个UNIX/Linux系统中的管道,当程序崩溃并打印出调试信息(如Python中的回溯)时,它会进入stderr管道。
print:print是一个包装器,它格式化输入(输入是参数和末尾换行符之间的空格),然后调用给定对象的write函数,默认情况下,给定对象是sys.stdout,但我们可以传递一个文件,也就是说,我们也可以在文件中打印输入。
蟒蛇2:如果我们使用的是python2,那么
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
Python2结尾的逗号在Python3中变成了一个参数,所以如果我们使用尾随逗号以避免打印后出现换行符,这将在Python3看起来像print(“要打印的文本”,end=“”),这是一种语法Python2下的错误。
http://python3porting.com/noconv.html
如果我们在python3中检查上述sceario:
>>> import sys
>>> print("hi")
hi
在Python2.6下,有一个将来的导入,可以将打印转换为作用因此,为了避免任何语法错误和其他差异,我们应该从将来的导入开始使用print()的任何文件print_函数。未来的导入仅适用于Python 2.6和稍后,对于Python 2.5和更早版本,您有两个选项。你可以或者将更复杂的打印转换为更简单的打印,或者您可以使用在Python2和蟒蛇3。
>>> from __future__ import print_function
>>>
>>> def printex(*args, **kwargs):
... print(*args, file=sys.stderr, **kwargs)
...
>>> printex("hii")
hii
>>>
案例:需要注意的是sys.stderr.write()或sys.stdout.write(stdout(标准输出)是一个管道UNIX/Linux系统)不是打印的替代品,但我们可以使用在某些情况下,它是一种选择。打印是包装在末尾输入空格和换行符,并使用write函数写这就是sys.stderr.write()更快的原因。注意:我们还可以使用日志记录跟踪和调试
#test.py
import logging
logging.info('This is the existing protocol.')
FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning("Protocol problem: %s", "connection reset", extra=d)
https://docs.python.org/2/library/logging.html#logger-对象
还没有人提到日志记录,但日志记录是专门为传递错误消息而创建的。基本配置将设置写入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”。
另一种方式
import sys
print("{}".format(sys.exec_info()[1], file=sys.stderr)
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替代。
对于Python 2,我的选择是:print>>sys.stderr,“垃圾邮件”因为您可以简单地打印列表/字典等,而无需将其转换为字符串。print>>sys.stderr,{'spam':'spam'}而不是:sys.stderr.write(str({'spam':'spam'}))