python sys.stdin,sys.stdout,sys.stderr

stdin , stdout ,以及stderr 变量 包含与标准I/O流 对应的流对象.
如果需要更好地控制输出,而print 不能满足我们的要求, 它们就是我们所需要的. 
也可以替换它们, 这时候我们可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

测试一下标准输出:

[python] view plain copy
  1. #testing stdout  
  2. >>> print 'Hello World!' #该语句会在标准输出的屏幕上打印 Hello World!  
  3. Hello World!  
  4. #等价于:  
  5. >>> import sys  
  6. >>> sys.stdout.write('Hello World!\n')  
  7. Hello World!  


我们再测试一下标准输入:

[python] view plain copy
  1. #testing stdin  
  2. >>> print 'Hi,%s!' % raw_input('Please enter your name:')  
  3. Please enter your name:python  
  4. Hi,python!  
  5. >>>   

这就是从 标准输入:键盘  获取信息,再输出到 标准输出:屏幕   
那么上面的例子中print 和 raw_input是如何与标准输入/输出流 建立关系的呢?
其实Python程序的标准输入/输出/出错流 定义在sys模块中,分别为: sys.stdin, sys.stdout, sys.stderr
上面的测试标准输入程序与下列的程序是一样的:

stdin.py文件:

[python] view plain copy
  1. #!usr/bin/env python  
  2. #coding:utf-8  
  3. import sys  
  4. print 'Please enter your name:',  
  5. name=sys.stdin.readline()[:-1]  
  6. print 'Hi,%s!' % name  

运行结果:

[python] view plain copy
  1. song@ubuntu:~$ python stdin.py  
  2. Please enter your name:song  
  3.  Hi,song!  

那么sys.stdin, sys.stdout, stderr到底是什么呢?我们在Python运行环境中输入以下代码:

[python] view plain copy
  1. >>> import sys  
  2. >>> sys.stdin  
  3. <open file '<stdin>', mode 'r' at 0x7f63dd3cf0c0>  
  4. >>> sys.stdout  
  5. <open file '<stdout>', mode 'w' at 0x7f63dd3cf150>  
  6. >>> sys.stderr  
  7. <open file '<stderr>', mode 'w' at 0x7f63dd3cf1e0>  

由此可以看出stdin, stdout, stderr在Python中都是文件属性的对象,
他们在Python启动时自动与Shell环境中的标准输入,输出,出错 关联。
而Python程序的在Shell中的I/O重定向与DOS命令的重定向完全相同,
其实这种重定向是由Shell来提供的,与Python 本身并无关系。
那么我们是否可以在Python程序内部将stdin,stdout,stderr读写操作重定向到一个内部对象呢?答案是肯定的。
Python提供了一个StringIO模块来完成这个设想,比如:

[python] view plain copy
  1. >>> from StringIO import StringIO  
  2. >>> import sys  
  3. >>> buf=StringIO()  
  4. >>> temp=sys.stdout #重定向前保存stdout  
  5. >>> sys.stdout=buf  #将stdout重定向到buff对象  
  6. >>> print 825,'python',0,666  # print会在要打印的信息后面加上一个硬回车  
  7. >>> sys.stdout=temp  #恢复stdout  
  8. >>> buf.getvalue() # print会在要打印的信息后面加上一个硬回车,因此最后有一个'\n'  
  9. '825 python 0 666\n'   


posted @ 2018-01-26 09:59  人到中年万事休  阅读(1164)  评论(0编辑  收藏  举报