python重定向sys.stdin、sys.stdout和sys.stderr

标准输入、标准输出和错误输出。

标准输入:一般是键盘。stdin对象为解释器提供输入字符流,一般使用raw_input()和input()函数。

例如:让用户输入信息(Python环境为2.x):

1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 import sys
4 name = raw_input("Please input your name: ")
5 print name
6
7 # python test.py
8 Please input your name: xiaoming
9 xiaoming
1 import sys
2 print "Please enter your name: "
3 name = sys.stdin.readline()
4 print name
5
6 # python b.py
7 Please enter your name:
8 xiaoming
9 xiaoming

再例如,a.py文件标准输出作为b.py文件标准输入:

 1 # cat a.py
 2 import sys
 3 sys.stdout.write("123456\n")
 4 sys.stdout.flush()
 5 # cat b.py
 6 import sys
 7 print sys.stdin.readlines()
 8
 9 # python a.py | python b.py
10 [‘123456\n‘]

sys.stdout.write()方法其实就是下面所讲的标准输出,print语句就是调用了这个方法。

标准输出:一般是屏幕。stdout对象接收到print语句产生的输出。

例如:打印一个字符串:

1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 import sys
4 print "Hello world!"
5
6 # python test.py
7 Hello world!

sys.stdout是有缓冲区的,比如:

1 import sys
2 import time
3 for i in range(5):
4     print i,
5     # sys.stdout.flush()
6     time.sleep(1)
7 # python test.py
8 0 1 2 3 4

本是每隔一秒输出一个数字,但现在是循环完才会打印所有结果。如果把sys.stdout.flush()去掉,就会没执行到print就会刷新stdout输出,这对实时输出信息的程序有帮助。

错误输出:一般是错误信息。stderr对象接收出错的信息。

例如:引发一个异常

1 >>> raise Exception, "raise..."
2 Traceback (most recent call last):File "<stdin>", line 1, in <module>
3 Exception: raise...

总结:

 sys.stdout与print

当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了 sys.stdout.write(obj+‘\n‘) ;print 将你需要的内容打印到了控制台,然后追加了一个换行符;print 会调用 sys.stdout 的 write 方法

以下两行在事实上等价:

1 sys.stdout.write(‘hello‘+‘\n‘)
2
3 print ‘hello‘

sys.stdin与raw_input:

当我们用 raw_input(‘Input promption: ‘) 时,事实上是先把提示信息输出,然后捕获输入

以下两组在事实上等价:

1 hi=raw_input(‘hello? ‘)
2
3 print ‘hello? ‘, #comma to stay in the same line
4
5 hi=sys.stdin.readline()[:-1] # -1 to discard the ‘\n‘ in input stream

从控制台重定向到文件

原始的 sys.stdout 指向控制台

如果把文件的对象的引用赋给 sys.stdout,那么 print 调用的就是文件对象的 write 方法

1 f_handler=open(‘out.log‘, ‘w‘)
2
3 sys.stdout=f_handler
4
5 print ‘hello‘
6
7 # this hello can‘t be viewed on concole
8
9 # this hello is in file out.log

记住,如果你还想在控制台打印一些东西的话,最好先将原始的控制台对象引用保存下来,向文件中打印之后再恢复 sys.stdout:

1 __console__=sys.stdout
2
3 # redirection start #
4
5 ...
6
7 # redirection end
8
9 sys.stdout=__console__
时间: 2024-10-06 07:06:14

python重定向sys.stdin、sys.stdout和sys.stderr的相关文章

python模块之re,os,sys。冒泡算法和反射。

python内置模块之(os,sys,hashlib,re) os模块 1 os.path.dirname() # 获取文件的上一层目录名,其实就是os.path.split(path)的第一个元素 2 os.path.abspath() # 获取文件的绝对路径,包括文件名 3 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 4 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd 5 os.curdir 返回当前目录:

Python全栈之路----常用模块----sys模块

sys.argv  命令行参数 List,第一个元素是程序本身路径 #test.py import sys print(sys.argv) D:\ProgramLearning\Py_program>python test.py ['test.py'] D:\ProgramLearning\Py_program>python test.py run web ['test.py', 'run', 'web'] sys.exit(n)  退出程序,正常退出时 exit(0) >>>

Python的sys.stdout、sys.stdin重定向

Python的sys.stdout.sys.stdin重定向 转自:http://www.cnblogs.com/turtle-fly/p/3280519.html 本文环境:Python 2.7 使用 print obj 而非 print(obj) 一些背景 sys.stdout 与 print 当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了 sys.stdout.write(obj+'\n') print 将你需要的内容打印到了控制台,然后追加了一个换行符

python中sys.stdout、sys.stdin

1.如果需要更好的控制输出,而print不能满足需求,sys.stdout,sys.stdin,sys.stderr就是你需要的. 2.sys.stdout与print: 在python中调用print时,事实上调用了sys.stdout.write(obj+'\n') print 将需要的内容打印到控制台,然后追加一个换行符 以下两行代码等价: sys.stdout.write('hello' + '\n') print('hello') 3.sys.stdin与input sys.stdin

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

Python基础四--random,so ,sys模块

一.random 1. 产生随机小数(0,1):random.random(): 2. 产生[1,5]范围内的整数:random.randint(1,5): 3. 产生[1,5)范围内的整数:random.randrange(1,5); 4. 列表元素任意1个元素:random.choice([1,'ab',[2,3]]); 5. 列表元素任意2个组合(list):random.sample([1,'ab',[2,3]],2); 6. (1,5)之间的小数:random.uniform(1,5)

sys.stdin的三种方式

1. for line in sys.stdin: import sys sys.stdout.write('根据两点坐标计算直线斜率k,截距b:\n') for line in sys.stdin: if line == '\n': break x1, y1, x2, y2 = (float(x) for x in line.split()) k = (y2 - y1) / (x2 - x1) b = y1 - k * x1 sys.stdout.write('斜率:{},截距:{}\n'.f

input()和sys.stdin.readline()的比较

1.sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',input()则不会.一下例子,输入  hello import sys line = sys.stdin.readline() for i in range(len(line)): print(line[i]+'hello') ==> hhelloehellolhellolhelloohello hello 而 import sys line = input() for i in range(len(lin

sys.stdin.readline()和raw_input()的区别

sys.stdin.readline()会将标准的输入全部获取,包括末尾的'\n',但是raw_input()获取的输入是不包括换行符'\n'的. 1 import sys 2 line1 = raw_input() 3 line2 = sys.stdin.readline() 4 5 print len(line1),len(line2) 运行结果如下:         有点不理解为什么line2的长度是5,不是应该是4的么??? 1 line = input() 2 3 print len(