Python重定向之print >>和sys.stdout

发布时间:2022-04-22 09:37:44 人气:97 作者:多测师

  print >>重定向

  这种方式基于print语句的扩展形式,即"print obj >> expr"。其中,obj为一个file-like(尤其是提供write方法的)对象,为None时对应标准输出(sys.stdout)。expr将被输出到该文件对象中。示例如下:

  memo = cStringIO.StringIO(); serr = sys.stderr; file = open('out.txt', 'w+')

  print >>memo, 'StringIO'; print >>serr, 'stderr'; print >>file, 'file'

  print >>None, memo.getvalue()

  上述代码执行后,屏显为"serr"和"StringIO"(两行,注意顺序),out.txt文件内写入"file"。

  可见,这种方式非常灵活和方便。缺点是不适用于输出语句较多的场景。

  sys.stdout重定向

  将一个可写对象(如file-like对象)赋给sys.stdout,可使随后的print语句输出至该对象。重定向结束后,应将sys.stdout恢复最初的缺省值,即标准输出。

  简单示例如下:

  import sys

  savedStdout = sys.stdout #保存标准输出流

  with open('out.txt', 'w+') as file:

  sys.stdout = file #标准输出重定向至文件

  print 'This message is for file!'

  sys.stdout = savedStdout #恢复标准输出流

  print 'This message is for screen!'

  注意,IDLE中sys.stdout初值为PseudoOutputFile对象,与sys.__stdout__并不相同。为求通用,本例另行定义变量(savedStdout)保存sys.stdout,下文也将作此处理。此外,本例不适用于经由from sys import stdout导入的stdout对象。

Python重定向之print >>和sys.stdout

  以下将自定义多种具有write()方法的file-like对象,以满足不同需求:

  class RedirectStdout: #import os, sys, cStringIO

  def __init__(self):

  self.content = ''

  self.savedStdout = sys.stdout

  self.memObj, self.fileObj, self.nulObj = None, None, None

  #外部的print语句将执行本write()方法,并由当前sys.stdout输出

  def write(self, outStr):

  #self.content.append(outStr)

  self.content += outStr

  def toCons(self): #标准输出重定向至控制台

  sys.stdout = self.savedStdout #sys.__stdout__

  def toMemo(self): #标准输出重定向至内存

  self.memObj = cStringIO.StringIO()

  sys.stdout = self.memObj

  def toFile(self, file='out.txt'): #标准输出重定向至文件

  self.fileObj = open(file, 'a+', 1) #改为行缓冲

  sys.stdout = self.fileObj

  def toMute(self): #抑制输出

  self.nulObj = open(os.devnull, 'w')

  sys.stdout = self.nulObj

  def restore(self):

  self.content = ''

  if self.memObj.closed != True:

  self.memObj.close()

  if self.fileObj.closed != True:

  self.fileObj.close()

  if self.nulObj.closed != True:

  self.nulObj.close()

  sys.stdout = self.savedStdout #sys.__stdout__

  注意,toFile()方法中,open(name[, mode[, buffering]])调用选择行缓冲(无缓冲会影响性能)。这是为了观察中间写入过程,否则只有调用close()或flush()后输出才会写入文件。内部调用open()方法的缺点是不便于用户定制写文件规则,如模式(覆盖或追加)和缓冲(行或全缓冲)。

  重定向效果如下:

  redirObj = RedirectStdout()

  sys.stdout = redirObj #本句会抑制"Let's begin!"输出

  print "Let's begin!"

  #屏显'Hello World!'和'I am xywang.'(两行)

  redirObj.toCons(); print 'Hello World!'; print 'I am xywang.'

  #写入'How are you?'和"Can't complain."(两行)

  redirObj.toFile(); print 'How are you?'; print "Can't complain."

  redirObj.toCons(); print "What'up?" #屏显

  redirObj.toMute(); print '' #无屏显或写入

  os.system('echo Never redirect me!') #控制台屏显'Never redirect me!'

  redirObj.toMemo(); print 'What a pity!' #无屏显或写入

  redirObj.toCons(); print 'Hello?' #屏显

  redirObj.toFile(); print "Oh, xywang can't hear me" #该串写入文件

  redirObj.restore()

  print 'Pop up' #屏显

  可见,执行toXXXX()语句后,标准输出流将被重定向到XXXX。此外,toMute()和toMemo()的效果类似,均可抑制输出。

  以上内容为大家介绍了Python重定向之print >>和sys.stdout,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线