Python退出包装时会诅咒TypeError

时间:2015-02-26 19:25:59

标签: python ncurses curses

我正在运行Mac OS X 10.9.5,并且在使用main()包装curses.wrapper函数时,我的程序成功退出后出现以下错误:

Traceback (most recent call last):
  File "test.py", line 42, in <module>
     wrapper(main(SCREEN))
  File     "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/curses/__init__.py", line 94, in wrapper
    return func(stdscr, *args, **kwds)
TypeError: 'NoneType' object is not callable

一些放大代码:

if __name__ == "__main__":
    # Initialize screen
    SCREEN = curses.initscr()

    # Run program with wrapper in case it fails
    wrapper(main(SCREEN))

    # Terminal cleanup
    curses.nocbreak()
    SCREEN.keypad(False)
    curses.echo()

如果我使用CTRL + C尝试在程序运行时退出程序,则会显示异常,但终端仍处于混乱状态(包装程序不执行此操作)。我在这里错过了一些明显的东西吗?

  • 编辑*

我确认这也会通过远程SSH终端会话在Ubuntu 14.10服务器版本上发生。

1 个答案:

答案 0 :(得分:2)

据我所见,你错误地调用了curses.wrapper函数。 来自documentation

curses.wrapper(func, ...)初始化curses并调用另一个可调用对象func,该对象应该是使用curses的其余应用程序。 (...)然后将可调用对象func作为其第一个参数传递给主窗口“stdscr”,然后传递给wrapper()的任何其他参数。

在您的示例中,它应如下所示:

def main(SCREEN):
    ... # My program code

if __name__ == "__main__": 
    # The function main gets the stdscr passed by curses itself
    wrapper(main)

如果您需要在主要电话

之前访问stdscr

在这种情况下我不会使用包装器,但是使用curses.endwin()来取消初始化curses库。 未经测试示例:

SCREEN = curses.initscr()
# Modify your curses settings here

try:
    main(SCREEN)
except: # End curses session before raising the error
    curses.endwin()
    raise
else: # End curses session if program terminates normally
    curses.endwin()