有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
当前回答
这将模拟标准打印函数,但输出到stderr
def print_err(*args):
sys.stderr.write(' '.join(map(str,args)) + '\n')
其他回答
在Python 3中,可以只使用print():
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
几乎开箱即用:
import sys
print("Hello, world!", file=sys.stderr)
or:
from sys import stderr
print("Hello, world!", file=stderr)
这很简单,不需要包含除sys.stderr之外的任何内容。
对于Python 2,我的选择是:print>>sys.stderr,“垃圾邮件”因为您可以简单地打印列表/字典等,而无需将其转换为字符串。print>>sys.stderr,{'spam':'spam'}而不是:sys.stderr.write(str({'spam':'spam'}))
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替代。
我想说你的第一个方法是:
print >> sys.stderr, 'spam'
是“一个……显而易见的方法”,其他人不满足规则1(“漂亮总比丑陋好”)
--2020年编辑--
以上是我在2011年对Python 2.7的回答。既然Python 3是标准,我认为“正确”的答案是:
print("spam", file=sys.stderr)
问题的答案是:在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-对象