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冒泡排序算法的实现代码
Nov 21 Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python常用模块介绍
Nov 21 Python
Python实现删除文件但保留指定文件
Jun 21 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
Python编程之Re模块下的函数介绍
Oct 28 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
Python加载带有注释的Json文件实例
May 23 Python
Python Django切换MySQL数据库实例详解
Jul 16 Python
Django 大文件下载实现过程解析
Aug 01 Python
pandas实现将日期转换成timestamp
Dec 07 Python
python 模块导入问题汇总
Feb 01 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中设置多级目录session的问题
2011/08/08 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
浅谈python 线程池threadpool之实现
2017/11/17 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
美国Max仓库:Max Warehouse
2020/05/31 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
几道数据库的面试题或笔试题
2014/05/31 面试题
Ajxa常见问题都有哪些
2014/03/26 面试题
实习鉴定范文
2013/12/19 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android