4

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

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

import curses
import time

curses.initscr()
curses.endwin()

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

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

4

4 回答 4

3

调用“将curses.endwin()标准 I/O 设置为正常”......不幸的是,这意味着“缓冲”(您可以认为这是一个错误curses并将错误归档到 Python 的跟踪器上)。

为了确保标准输出没有缓冲,

import os

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

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

于 2010-09-14T04:55:06.417 回答
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 代码,因此我将其存储为正常状态。

于 2010-09-14T05:03:46.583 回答
1

更清晰的方式:

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct
于 2015-03-26T05:47:28.787 回答
0

我发现 tis 依赖于系统/库。在我的 Windows 机器上(来自http://www.lfd.uci.edu/~gohlke/pythonlibs/的诅咒)它会刷新然后休眠,但在 Linux 上它会在休眠后刷新。我认为您可以简单地使用:sys.stdout.flush()例如:

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

(做某种“打印和刷新”功能可能会更好)

于 2010-09-14T05:00:59.643 回答