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 相关文章推荐
python函数局部变量用法实例分析
Aug 04 Python
Python松散正则表达式用法分析
Apr 29 Python
Python实现堆排序的方法详解
May 03 Python
python如何让类支持比较运算
Mar 20 Python
python保存网页图片到本地的方法
Jul 24 Python
python实现简单日期工具类
Apr 24 Python
python中正则表达式与模式匹配
May 07 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
Python如何使用turtle库绘制图形
Feb 26 Python
django为Form生成的label标签添加class方式
May 20 Python
python os模块在系统管理中的应用
Jun 22 Python
Python实现小黑屋游戏的完整实例
Jan 06 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缓存技术的多种方法小结
2012/08/14 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
限制复选框的最大可选数
2006/07/01 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
django 取消csrf限制的实例
2020/03/13 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Python用Jira库来操作Jira
2020/12/28 Python
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
国际商务系学生个人的自我评价
2013/11/26 职场文书
档案管理员岗位职责
2013/12/01 职场文书
客户经理岗位职责
2013/12/08 职场文书
竞职演讲稿范文
2014/01/11 职场文书
小学老师寄语大全
2014/04/04 职场文书
代理协议书范本
2014/04/22 职场文书
大学社团活动总结
2014/04/26 职场文书
参赛口号
2014/06/16 职场文书
员工年终自我评价
2014/09/14 职场文书
四风自我剖析材料
2014/09/30 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
《社戏》教学反思
2016/02/22 职场文书