问题的答案是:在 python 中打印 stderr 有不同的方法,但这取决于 1.) 我们使用的是哪个 python 版本 2.) 我们想要什么确切的输出。
print 和 stderr 的 write 函数之间的区别:
stderr : stderr(标准错误)是每个 UNIX/Linux 系统中内置的管道,当您的程序崩溃并打印出调试信息(如 Python 中的回溯)时,它会转到 stderr管道。
print : print 是一个包装器,它格式化输入(输入是参数和末尾换行符之间的空格),然后它调用给定对象的 write 函数,给定对象默认是 sys.stdout,但我们可以传递一个文件,即我们也可以在文件中打印输入。
Python2:如果我们使用的是 python2 那么
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
Python2 尾随逗号在 Python3 中已成为参数,因此如果我们使用尾随逗号来避免打印后的换行符,这在 Python3 中将看起来像 print('Text to print', end=' ') ,这是 Python2 下的语法错误.
http://python3porting.com/noconv.html
如果我们在 python3 中检查上述相同的情况:
>>> import sys
>>> print("hi")
hi
在 Python 2.6 下有一个未来的导入来将 print 变成一个函数。因此,为了避免任何语法错误和其他差异,我们应该从将来导入 print_function 开始使用 print() 的任何文件。未来的导入仅适用于 Python 2.6 及更高版本,因此对于 Python 2.5 及更早版本,您有两种选择。您可以将更复杂的打印转换为更简单的打印,也可以使用在 Python2 和 Python3 下都可以使用的单独打印函数。
>>> 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 系统中的管道)不是打印的替代品,但是是的在某些情况下,我们可以将其用作替代方案。Print 是一个包装器,它在最后用空格和换行符包装输入,并使用 write 函数进行写入。这就是 sys.stderr.write() 更快的原因。
注意:我们还可以使用 Logging 进行跟踪和调试
#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-objects