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

我将问题减少到了一个非常简单的程序,该程序可靠地失败:

import curses
import time

curses.initscr()
curses.endwin()

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

如果我评论两个诅咒电话,“你好!”延迟之前打印。如果我放入它们,它将在延迟后打印(脚本退出时)。

有帮助吗?

解决方案

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

为了确保标准输出不受欢迎,

import os

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

(你可以把 import os 在开始时或课程;重新分配 sys.stdout 本来要在 endwin 称呼)。

其他提示

亚历克斯击败了我(他知道,我必须弄清楚),但是我写了这位您可能可以使用的漂亮上下文经理。

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代码,因此我将其存储为正常。

更清晰的方法:

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct

我发现TIS与系统/库有关。在我的Windows机器上(诅咒来自 http://www.lfd.uci.edu/~gohlke/pythonlibs/)它冲洗然后睡觉,但是在Linux上,它在睡眠后冲洗。我认为您可以简单地使用: sys.stdout.flush() 像:

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

(更好地做出某种“打印和冲洗”功能可能会更好)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top