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
在Python中使用第三方模块的教程
Apr 27 Python
Python映射拆分操作符用法实例
May 19 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python实现电子书翻页小程序
Jul 23 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
python db类用法说明
Jul 07 Python
pandas按条件筛选数据的实现
Feb 20 Python
python之django路由和视图案例教程
Jul 26 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合并js请求的例子
2013/11/01 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
PHP如何实现跨域
2016/05/30 PHP
smarty模板数学运算示例
2016/12/11 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
深入浅析python with语句简介
2018/04/11 Python
python re模块的高级用法详解
2018/06/06 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
金智子午JAVA面试题
2015/09/04 面试题
仓库管理专业个人自我评价范文
2013/11/11 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
工作犯错保证书
2015/05/11 职场文书
孝女彩金观后感
2015/06/10 职场文书
监护人证明
2015/06/19 职场文书
行为规范主题班会
2015/08/13 职场文书
《迟到》教学反思
2016/02/24 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书