Python在退出包装时诅咒TypeError

Python在退出包装时诅咒TypeError,python,ncurses,curses,Python,Ncurses,Curses,我正在运行Mac OS X 10.9.5,当使用curses.wrapper包装我的main()函数时,程序成功退出后,我收到以下错误: 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.

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

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
如果我使用
CTRL+C
试图在程序运行时退出程序,则会显示异常,但终端仍处于混乱状态(包装器不执行其任务)。我是不是漏掉了一个明显的东西

  • 编辑*

我确认在Ubuntu14.10服务器版上通过远程SSH终端会话也会发生这种情况

据我所知,您调用的
curses.wrapper
函数错误。 从:

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 在这种情况下,我不会使用包装器,而是使用它来取消诅咒库的初始化。未经测试的示例:


我很确定
wrapper()
的整个要点是避免在示例中进行所有其他诅咒调用,事实上,您所做的是调用
initscr()
两次(先显式调用,然后隐式调用)。如果不调用
initscr()
,我如何获得屏幕?据我所知,
wrapper()
没有提供它。如果在调用
main()
函数之前需要访问屏幕,该怎么办?在这种情况下使用
包装器是否无效?
def main(SCREEN):
    ... # My program code

if __name__ == "__main__": 
    # The function main gets the stdscr passed by curses itself
    wrapper(main)
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()