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学习之编写查询ip程序
Feb 27 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
Python表示矩阵的方法分析
May 26 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
python实现银行管理系统
Oct 25 Python
python实现低通滤波器代码
Feb 26 Python
如何在python中执行另一个py文件
Apr 30 Python
python下载的库包存放路径
Jul 27 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
详解pytorch创建tensor函数
Mar 22 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
d3.js实现图形缩放平移
2019/12/19 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
Python3.6正式版新特性预览
2016/12/15 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
python实现发送邮件功能
2017/07/22 Python
详解Python 正则表达式模块
2018/11/05 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
几个人围成一圈的问题
2013/09/26 面试题
.NET方向面试题
2014/11/20 面试题
关于读书的演讲稿500字
2014/08/27 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA