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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
跟老齐学Python之print详解
Sep 28 Python
编写Python CGI脚本的教程
Jun 29 Python
Python制作爬虫采集小说
Oct 25 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
python中单下划线_的常见用法总结
Jul 10 Python
超实用的 30 段 Python 案例
Oct 10 Python
使用python创建生成动态链接库dll的方法
May 09 Python
Python批量处理csv并保存过程解析
May 16 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 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
5.PHP的其他功能
2006/10/09 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
迎八一活动主题
2014/01/31 职场文书
《秋游》教学反思
2014/04/24 职场文书
评先进个人材料
2014/12/29 职场文书
golang中的空slice案例
2021/04/27 Golang
SQL写法--行行比较
2021/08/23 SQL Server