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 相关文章推荐
使用pyecharts无法import Bar的解决方案
Apr 23 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
python使用tkinter实现简单计算器
Jan 30 Python
python实现AES加密与解密
Mar 28 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
Python 中判断列表是否为空的方法
Nov 24 Python
利用python中集合的唯一性实现去重
Feb 11 Python
什么是python的必选参数
Jun 21 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Python代码注释规范代码实例解析
Aug 14 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
详解PHP中的Traits
2015/07/29 PHP
百度地图API使用方法详解
2015/08/25 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
纠纷协议书
2014/04/16 职场文书
创业培训计划书
2014/05/03 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
起诉意见书范文
2015/05/19 职场文书
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
Golang连接并操作MySQL
2022/04/14 MySQL
Spring中bean集合注入的方法详解
2022/07/07 Java/Android