Python标准输出不';调用诅咒后不能正确刷新

Python标准输出不';调用诅咒后不能正确刷新,python,stdout,flush,curses,Python,Stdout,Flush,Curses,我有一个使用诅咒的程序,然后返回主脚本进行进一步处理。在它返回后,我随后对stdout的输出直到有大量(例如,数千字节)才会出现 我已将问题简化为一个非常简单的程序,该程序会可靠地失败: import curses import time curses.initscr() curses.endwin() print "Hello world!" time.sleep(5) 如果我把这两个咒骂的电话注释掉,“你好,世界!”在延迟之前打印。如果我把它们放进去,它会在延迟后打印(当脚本退出时)

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

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

import curses
import time

curses.initscr()
curses.endwin()

print "Hello world!"
time.sleep(5)
如果我把这两个咒骂的电话注释掉,“你好,世界!”在延迟之前打印。如果我把它们放进去,它会在延迟后打印(当脚本退出时)

调用
诅咒.endwin()
将标准I/O设置回正常状态”。。。不幸的是“缓冲”(你可以考虑<代码>中的错误诅咒< /代码>,并在Python的跟踪器上记录bug。

为确保标准输出无缓冲

import os

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

(您可以将
导入操作系统
放在开始或过程中;
sys.stdout
的重新分配意味着在
endwin
调用之后立即进行)。

我发现它依赖于系统/库。在我的Windows机器上(诅咒来自),它先刷新然后休眠,但在Linux上,它在休眠后刷新。我想您可以简单地使用:
sys.stdout.flush()
比如:

print "Hello world!"
sys.stdout.flush()
time.sleep(5)
(制作某种“打印和刷新”功能可能更好)

Alex比我快(他知道,我必须弄清楚),但我编写了这个漂亮的上下文管理器,您可能可以使用它

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.\uuuu stdout\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct

可能是@jack的副本。不。这与为什么首先需要刷新输出缓冲区有关确定,抱歉。只是试着帮我指出一些可以帮助你的东西!那么stdout是以无缓冲的方式开始生活的吗?我以为那就是u旗的作用。但是,是的,这个修复很有效,谢谢。到底是什么“使标准I/O恢复正常”?我在Python文档、curses模块源代码或endwin手册页(curs_initscr(3X))中没有看到这一点。这也很好,但我不能使用它,因为这个项目是在Python2.4上的。不过谢谢你。