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的randrange()方法使用教程
May 15 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
Python-接口开发入门解析
Aug 01 Python
python关闭占用端口方式
Dec 17 Python
详解python itertools功能
Feb 07 Python
Django静态资源部署404问题解决方案
May 11 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
pytorch中的numel函数用法说明
May 13 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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的php防止sql注入函数
2011/01/17 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
JS清除选择内容的方法
2015/01/29 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Vue非父子组件通信详解
2017/06/12 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
js实现简易计算器小功能
2020/11/18 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python 实现图片批量压缩的示例
2020/12/18 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
工程部经理岗位职责
2013/12/08 职场文书
车贷收入证明范本
2014/09/14 职场文书
行政助理岗位职责
2015/02/10 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
鸡毛信观后感
2015/06/11 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL