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小程序分享
Dec 05 Python
python爬取各类文档方法归类汇总
Mar 22 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
Python 函数list&read&seek详解
Aug 28 Python
python将时分秒转换成秒的实例
Dec 07 Python
python实现图像拼接
Mar 05 Python
python判断是空的实例分享
Jul 06 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
Django中template for如何使用方法
Jan 31 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
python 判断文件或文件夹是否存在
Mar 18 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
第十三节 对象串行化 [13]
2006/10/09 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
python返回昨天日期的方法
2015/05/13 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
python代码区分大小写吗
2020/06/17 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
离婚协议书的书写要求
2014/09/17 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
六五普法学习心得体会
2016/01/21 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS