python中stdout输出不缓存的设置方法


Posted in Python onMay 29, 2014

考虑以下python程序:

#!/usr/bin/env pythonimport sys
sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")

其中的sys.stdout.write也可以换成print。
运行这程序,你觉得会输出什么?试验一下,就会发现,其实输出并不是
stdout1 stderr1  stdout2 stderr2

而是:
stderr1 stderr2 stdout1  stdout2

究其原因,是因为缓存:虽然stderr和stdout默认都是指向屏幕的,但是stderr是无缓存的,程序往stderr输出一个字符,就会在屏幕上显示一个;而stdout是有缓存的,只有遇到换行或者积累到一定的大小,才会显示出来。这就是为什么上面的会显示两个stderr的原因了。
然而,有时候,你可能还是希望stdout的行为和stderr一样,能不能实现呢?当然是可以的,而且对于python,实现起来还特别方便,以下是两个方法:
python -u stderr_stdout.py
PYTHONUNBUFFERED=1 python stderr_stdout.py

第一种方法是给python指定 -u 参数,第二种方法是在python运行时,指定 PYTHONUNBUFFERED 环境变量,这两种方法其实是等效的。
当然,也可以在程序的第一行指定 #!/usr/bin/python -u 然后程序加可执行权限来运行,或者把 export PYTHONUNBUFFERED=1 写到 .bashrc 里去。

附:stackoverflow上也有同学遇到类似问题,可以参考一下

地址:http://stackoverflow.com/questions/107705/python-output-buffering

被采纳的代码:

class Unbuffered(object):
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
   def __getattr__(self, attr):
       return getattr(self.stream, attr)
import sys
sys.stdout = Unbuffered(sys.stdout)
print 'Hello'
Python 相关文章推荐
在Django的视图(View)外使用Session的方法
Jul 23 Python
Python中字典映射类型的学习教程
Aug 20 Python
Pyspider中给爬虫伪造随机请求头的实例
May 07 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
对python中的装包与解包实例详解
Aug 24 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
python 经典数字滤波实例
Dec 16 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
Python  word实现读取及导出代码解析
Jul 09 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
python两种遍历字典(dict)的方法比较
May 29 #Python
python中常用的各种数据库操作模块和连接实例
May 29 #Python
从零学Python之入门(五)缩进和选择
May 27 #Python
从零学Python之入门(四)运算
May 27 #Python
一则python3的简单爬虫代码
May 26 #Python
从零学Python之入门(三)序列
May 25 #Python
从零学Python之入门(二)基本数据类型
May 25 #Python
You might like
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
YII实现分页的方法
2014/07/09 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python实现LRU算法的2种方法
2015/06/24 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
详解Python中的测试工具
2019/06/09 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
如何用JQuery进行表单验证
2013/05/29 面试题
土木工程应届生自荐信
2013/09/24 职场文书
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
医学院护理专业应届生求职信
2013/11/12 职场文书
工作自荐信
2013/12/11 职场文书
青年文明号事迹材料
2014/01/18 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
加强党性修养心得体会
2016/01/21 职场文书
课改心得体会范文
2016/01/25 职场文书