I am LAZY bones? AN ancient AND boring SITE

设置python的stdout为无缓存模式

考虑以下python程序:

#!/usr/bin/env python
 
import 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 里去。

最后修改时间: 2010年08月30日 09:26

本文章发表于: 2010年08月29日 21:52 | 所属分类:编程相关. | 您可以在此订阅本文章的所有评论. | 您也可以发表评论, 或从您的网站trackback.

12 个评论 关于: “设置python的stdout为无缓存模式”

  1. Jimmy Xu 在 2010年08月29日 22:52 说:回复

    或者把 export YTHONUNBUFFERED=1 写到 .bashrc 里去。
        ^ P

  2. Tweets that mention luy.li 新文章: 设置python的stdout为无缓存模式 ( ) -- Topsy.com 在 2010年08月29日 23:35 说:回复

    […] This post was mentioned on Twitter by bones7456, linuxtty. linuxtty said: [GReader] 设置python的stdout为无缓存模式 http://tinyurl.com/29ahnvq […]

  3. KL 在 2010年08月30日 00:13 说:回复

    I think this way is better:

    sys.stdout = os.fdopen(sys.stdout.fileno(), ‘w’, 0)

    I think your solution is difficult to deploy (need to manipulate environment var.)

    http://stackoverflow.com/questions/107705/python-output-buffering

    • bones7456 在 2010年08月30日 09:29 说:回复

      Yes, if your python script is distributed to end users, this is a better solution. thanks!

  4. TualatriX 在 2010年08月30日 15:26 说:回复

    骨哥,个人觉得还是手动flush一下比较方便~比较这样跟环境无关了。

    • bones7456 在 2010年08月31日 13:17 说:回复

      呵呵,问题是程序已经写完了,N多地方要改呢。改代码的话,就用上面 KL 兄那招,比较方便。

  5. xiooli 在 2010年08月31日 00:27 说:回复

    安卓手机GPRS+UC上网飘过,表示骨头的排版不错!

    • bones7456 在 2010年08月31日 13:24 说:回复

      恩,我这里支持w3m的。

  6. delectate 在 2010年09月03日 18:32 说:回复

    呃,文本框颜色和背景色相差太多了,建议把文本框弄成灰色背景,这样子看起来舒服一些~因为文本框干扰,基本上第一眼抓不住文章重点了。

    • bones7456 在 2010年09月03日 21:25 说:回复

      你说的文本框是WP-syntax,这玩意是给白色背景设计的,但是又不太好单独改背景色,因为如果改成灰色的话,有写灰色的文字就看不到了。。。

  7. lexus 在 2010年09月19日 17:26 说:回复

    博主,有没有im的联系方式或是邮箱,想请教一下技术问题,你的关于我水平有限,没看懂

发表评论