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中的协程
Oct 08 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
python实现低通滤波器代码
Feb 26 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
python安装sklearn模块的方法详解
Nov 28 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
Discuz 模板引擎的封装类代码
2008/07/18 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
PHP框架性能测试报告
2016/05/08 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
删除重复数据的算法
2006/11/23 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
python进程管理工具supervisor使用实例
2014/09/17 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python生成随机数组的方法小结
2017/04/15 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
django页面跳转问题及注意事项
2019/07/18 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
python 调整图片亮度的示例
2020/12/03 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
法制宣传标语集锦
2014/06/25 职场文书
夏季药店促销方案
2014/08/22 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js