转自:https://www.cnblogs.com/guyuyuan/p/6885448.html
标准输入、标准输出和错误输出。
标准输入:一般是键盘。stdin对象为解释器提供输入字符流,一般使用raw_input()和input()函数。
例如:让用户输入信息(Python环境为2.x):
1 #!/usr/bin/python
2 #-*- coding: utf-8 -*- 3 importsys 4 name = raw_input("Please input your name: ") 5 printname 6 7 #python test.py 8 Please input your name: xiaoming 9 xiaoming
1 importsys
2 print "Please enter your name: " 3 name =sys.stdin.readline() 4 printname 5 6 #python b.py 7 Please enter your name: 8 xiaoming 9 xiaoming
再例如,a.py文件标准输出作为b.py文件标准输入:
1 #cat a.py
2 importsys 3 sys.stdout.write("123456\n") 4 sys.stdout.flush() 5 #cat b.py 6 importsys 7 printsys.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 importsys 4 print "Hello world!" 5 6 #python test.py 7 Hello world!
sys.stdout是有缓冲区的,比如:
1 importsys
2 importtime 3 for i in range(5): 4 printi, 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 "", line 1, in 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__