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的正则表达式re模块的常用方法
Mar 09 Python
python快速查找算法应用实例
Sep 26 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
Python制作Windows系统服务
Mar 25 Python
Python从零开始创建区块链
Mar 06 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
详解Flask前后端分离项目案例
Jul 24 Python
pycharm 添加解释器的方法步骤
Aug 31 Python
python3 os进行嵌套操作的实例讲解
Nov 19 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
py2exe 编译ico图标的代码
2013/03/08 Python
python字符串替换示例
2014/04/24 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
数控专业推荐信范文
2013/12/02 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
助学贷款贫困证明
2014/09/23 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
委托书范本格式
2019/04/18 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Python matplotlib绘制雷达图
2022/04/13 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers