博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python sys.stdin,sys.stdout,sys.stderr
阅读量:4172 次
发布时间:2019-05-26

本文共 1640 字,大约阅读时间需要 5 分钟。

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

测试一下标准输出:

#testing stdout>>> print 'Hello World!' #该语句会在标准输出的屏幕上打印 Hello World!Hello World!#等价于:>>> import sys>>> sys.stdout.write('Hello World!\n')Hello World!
我们再测试一下标准输入:

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

stdin.py文件:

#!usr/bin/env python#coding:utf-8import sysprint 'Please enter your name:',name=sys.stdin.readline()[:-1]print 'Hi,%s!' % name
运行结果:

song@ubuntu:~$ python stdin.pyPlease enter your name:song Hi,song!
那么sys.stdin, sys.stdout, stderr到底是什么呢?我们在Python运行环境中输入以下代码:

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

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

关于sys模块,更详细的介绍,请参考:

1》

2》

转载地址:http://kiyai.baihongyu.com/

你可能感兴趣的文章
嵌入式Linux驱动开发的知识图谱
查看>>
Algorithm 4th environment setup
查看>>
Linux设备驱动开发基础之互斥与同步基础
查看>>
Linux驱动开发之内存管理基础
查看>>
用gitlabCI快速搭建一个GitServer与CI
查看>>
SPI Nor Flash
查看>>
ARM Linux BenchMark
查看>>
完整精确导入Kernel与Uboot参与编译了的代码到Source Insight,Understand, SlickEdit
查看>>
Freescale IMX6 Android (5): APP通过JNI控制LED
查看>>
PPT分享: Linux启动流程 关于initrd与initramfs的区分及其发展历程
查看>>
Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总
查看>>
Yocto i.MX6 (TQIMX6) (01) : 3.14.28内核的适配
查看>>
Yocto tips (6): Yocto中如何共享已经下载的文件
查看>>
Yocto tips (1): Yocto 编译后文件放在了哪里 输出文件位置
查看>>
Yocto tips (2): Yocto Linux内核编译目录在哪?
查看>>
Yocto tips (3): Yocto 如何重新编译Linux内核与dtb,并放到deploy目录?
查看>>
Yocto tips (4): Yocto 如何确定(找到)一个包的名字
查看>>
start kernel 之后没有任何输出与uboot无法将bootargs传入内核的调查方法与解决之道
查看>>
Yocto tips (5): Yocto如何更改source code的下载与git clone地址
查看>>
Yocto tips (7): Yocto Bitbake的clean与cleanall以及cleansstate的区别
查看>>