调用curses后,Python stdout没有正确刷新

时间:2010-09-14 04:05:28

标签: python stdout flush curses

我有一个使用curses的程序,然后返回主脚本进行进一步处理。返回之后,我的后续输出到stdout直到有大量的输出(例如数千字节)才会出现。

我已将问题简化为一个非常简单的程序,该程序可靠地失败:

import curses
import time

curses.initscr()
curses.endwin()

print "Hello world!"
time.sleep(5)

如果我注释掉两个curses调用,那么'Hello world!'在延迟之前打印。如果我把它们放入,它会在延迟后打印(当脚本退出时)。

4 个答案:

答案 0 :(得分:3)

curses.endwin()调用“将标准I / O恢复正常”......不幸的是意味着“缓冲”(您可以考虑curses中的错误并在Python的跟踪器上提交错误)

确保标准输出无缓冲,

import os

sys.stdout = os.fdopen(0, 'w', 0)

(您可以将import os放在开头或课程中; sys.stdout的重新分配意味着在endwin来电之后立即进行。

答案 1 :(得分:1)

亚历克斯打败了我(他知道,我不得不弄清楚)但我写了这个漂亮的上下文管理器,你可以使用它。

import curses
import time
import os
import sys


class CursesStdout(object):
    def __enter__(self):
        pass

    def __exit__(self, *args):
        sys.stdout = sys.__stdout__ = os.fdopen(sys.__stdout__.fileno(), 'w', 0)

with CursesStdout():
    curses.initscr()
    curses.endwin()


print "Hello world!"
time.sleep(2)

我直接修改sys.__stdout__,因为当您查看curses/__init__.py中的源时,您会看到initscr函数将该文件描述符传递给C代码,因此我将其存储为要重置正常。

答案 2 :(得分:1)

更明确的方式:

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct

答案 3 :(得分:0)

我发现tis依赖于系统/库。在我的Windows机器上(来自http://www.lfd.uci.edu/~gohlke/pythonlibs/的诅咒)它会刷新然后睡觉,但是在Linux上它会在睡眠后冲洗。我想你可以简单地使用:sys.stdout.flush()喜欢:

print "Hello world!"
sys.stdout.flush()
time.sleep(5)

(制作某种“打印和冲洗”功能可能更好)