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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python命令行参数解析模块getopt使用实例
Apr 13 Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
python将list转为matrix的方法
Dec 12 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
keras 权重保存和权重载入方式
May 21 Python
python datetime时间格式的相互转换问题
Jun 11 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
Opencv中cv2.floodFill算法的使用
Jun 18 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读取纯真ip数据库使用示例
2014/01/26 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
告诉大家什么是JSON
2008/06/10 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
vue注册组件的几种方式总结
2018/03/08 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
简单实现python进度条脚本
2017/12/18 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
电教室标语
2014/06/20 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
呐喊读书笔记
2015/06/30 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
Redis如何实现分布式锁
2021/08/23 Redis