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使用random和tertools模块解一些经典概率问题
Jan 28 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
Python简易版图书管理系统
Aug 12 Python
python3调用windows dos命令的例子
Aug 14 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
python des,aes,rsa加解密的实现
Jan 16 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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一些十分严重的缺陷详解
2013/06/03 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
php数组指针操作详解
2017/02/14 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
python读取LMDB中图像的方法
2018/07/02 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
python dict乱码如何解决
2020/06/07 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
数学教学随笔感言
2014/02/17 职场文书
爽歪歪广告词
2014/03/20 职场文书
购房意向书范本
2014/04/01 职场文书
幼儿评语大全
2014/04/30 职场文书
护林员个人总结
2015/03/04 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技