有几种方法可以写入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)
这些方法之间有什么区别?应首选哪种方法?
当前回答
这同样适用于标准输出:
print 'spam'
sys.stdout.write('spam\n')
如其他答案所述,打印提供了一个漂亮的界面,通常更方便(例如,用于打印调试信息),而写入速度更快,并且在必须以某种方式精确格式化输出时也更方便。我也会考虑可维护性:
您可以稍后决定在stdout/stderr和常规文件之间切换。print()语法在Python3中发生了变化,因此如果您需要同时支持这两个版本,write()可能会更好。
其他回答
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')
如果进行简单测试:
import time
import sys
def run1(runs):
x = 0
cur = time.time()
while x < runs:
x += 1
print >> sys.stderr, 'X'
elapsed = (time.time()-cur)
return elapsed
def run2(runs):
x = 0
cur = time.time()
while x < runs:
x += 1
sys.stderr.write('X\n')
sys.stderr.flush()
elapsed = (time.time()-cur)
return elapsed
def compare(runs):
sum1, sum2 = 0, 0
x = 0
while x < runs:
x += 1
sum1 += run1(runs)
sum2 += run2(runs)
return sum1, sum2
if __name__ == '__main__':
s1, s2 = compare(1000)
print "Using (print >> sys.stderr, 'X'): %s" %(s1)
print "Using (sys.stderr.write('X'),sys.stderr.flush()):%s" %(s2)
print "Ratio: %f" %(float(s1) / float(s2))
你会发现sys.stderr.write()总是快1.81倍!
这同样适用于标准输出:
print 'spam'
sys.stdout.write('spam\n')
如其他答案所述,打印提供了一个漂亮的界面,通常更方便(例如,用于打印调试信息),而写入速度更快,并且在必须以某种方式精确格式化输出时也更方便。我也会考虑可维护性:
您可以稍后决定在stdout/stderr和常规文件之间切换。print()语法在Python3中发生了变化,因此如果您需要同时支持这两个版本,write()可能会更好。
我发现这是唯一一个简短、灵活、便携和可读的:
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