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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
使用cx_freeze把python打包exe示例
Jan 24 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Zabbix实现微信报警功能
Oct 09 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
Python实现的简单排列组合算法示例
Jul 04 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
Python Pillow(PIL)库的用法详解
Sep 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python类的专用方法实例分析
2015/01/09 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
django中使用POST方法获取POST数据
2019/08/20 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
进步之星获奖感言
2014/02/22 职场文书
国庆宣传标语
2014/06/30 职场文书
薪资证明范本
2015/06/19 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
科级干部培训心得体会
2016/01/06 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android