我有一个使用curses的程序,然后返回主脚本进行进一步处理。返回之后,我的后续输出到stdout直到有大量的输出(例如数千字节)才会出现。
我已将问题简化为一个非常简单的程序,该程序可靠地失败:
import curses
import time
curses.initscr()
curses.endwin()
print "Hello world!"
time.sleep(5)
如果我注释掉两个curses调用,那么'Hello world!'在延迟之前打印。如果我把它们放入,它会在延迟后打印(当脚本退出时)。
答案 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)
(制作某种“打印和冲洗”功能可能更好)