python中sys.stdin,python sys.stdout用法

  python中sys.stdin,python sys.stdout用法

  今天突然看到sys的两个特殊用途。一般这种很少用。

  1.sys.stdout.write()和print()

  当我们在Python中调用print(obj)时,我们实际上调用的是sys.stdout.write(obj \n )

  将需要打印的内容打印到控制台,然后追加一个换行符。

  Print调用sys.stdout的write方法

  下面两行实际上是等价的:

  导入sys . stdout . write( hello \ n )print(hello)2 sys . stdin . readline()并输入

  Sys.stdin.readline()将获取所有标准输入,包括末尾的 \n ,因此在用len计算长度时会考虑换行符 \n ,但input()在获取输入时返回的结果不包含末尾的换行符 \n 。

  一般不能这么用:如果平时用sys.stdin.readline()获取输入,不要忘了去掉末尾的换行符。可以使用Python的string来处理strip()函数(sys.stdin.readline()。strip(\n ))或sys.stdin.readline( )[:-1]

  3从控制台重定向到文件

  原始sys.stdout指向控制台。

  如果将引用分配给将文件写入sys.stdout的对象(write with open ),则print调用file对象的write方法。

  Import with open (sys _ out.log , w) as h: sys.stdout=hprint (hello)记住,如果你还想在控制台上打印一些东西,最好先保存原来的控制台对象引用,打印成文件再恢复sys.stdout。

  # redirection start _ _ console _ _=sys . stdout #重定向到控制台输出sys.stdout=__console__ 3同时重定向到控制台和文件。

  如果我们希望打印的内容一方面输出到控制台,另一方面作为日志输出到一个文件,我们应该怎么做?

  将打印的内容保存在内存中,而不是一打印出来就释放并刷新缓冲区。放在字符串区域会怎么样?

  a=

  sys.stdout=a

  打印“你好”

  好了,上面的代码不能正常运行了。

  回溯(最近一次调用):文件。“hello.py”,第xx行,打印“hello”

  attribute error:“str”

  对象没有属性“write”

  错误是显而易见的,这是上面强调的。尝试调用sys.stdout.write()时,发现没有写方法。

  另外,这里之所以提示属性错误而不是找不到函数等等。我猜是因为python把对象/类的函数指针记录当作了对象/类的属性,而只保留了函数的入口地址。

  在这种情况下,我们必须为重定向的对象实现一个写方法:

  import sys class _ _ redirection _ _:def _ _ init _ _(self):self . buff= self。_ _ console _ _=sys . stdout def write(self,output _ stream):self . buff=output _ stream def to _ console(self):sys . stdout=self。_ _ console _ _ print(self . buff)def to _ file(self,file_path): f=open(file_path, w )sys . stdout=f print(self . buff)f . close()def flush(self):self . buff= def reset(self):sys . stdout=self。_ _ console _ _ if _ _ name _ _= _ _ main _ _ :# redirection r _ obj=_ _ redirection _ _()sys . stdout=r _ obj # get output stream print hello print there # Redirect to console _ obj . to _ console()# Redirect filer _ obj . to _ file( out . log )# flush buffer _ obj . flush()# resetr _ obj . reset()同样,sys.stderr、sys.stdin也可以重定向到多个地址,自己做就行了。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: