有几种方法可以写入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中打印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-对象
我想说你的第一个方法是:
print >> sys.stderr, 'spam'
是“一个……显而易见的方法”,其他人不满足规则1(“漂亮总比丑陋好”)
--2020年编辑--
以上是我在2011年对Python 2.7的回答。既然Python 3是标准,我认为“正确”的答案是:
print("spam", file=sys.stderr)
import sys
sys.stderr.write()
是我的选择,只是更具可读性,更准确地说出您想要做的事情,并且可以跨版本移植。
编辑:在可读性和性能方面,“蟒蛇”是我的第三个想法。。。考虑到这两件事,使用python,80%的代码将是pythonic的。列表理解是不经常使用的“大事”(可读性)。
我发现这是唯一一个简短、灵活、便携和可读的:
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
我使用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")