Python 退出包装器时诅咒 TypeError
Python curses TypeError when exiting wrapper
我是 运行 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
一些放大代码:
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
尝试在程序处于 运行 时退出该程序,则会显示异常,但终端仍处于混乱状态(包装器无法完成它的工作)。我在这里错过了一些明显的东西吗?
- 编辑 *
我确认这也发生在 Ubuntu 14.10 服务器版本上,通过远程 SSH 终端会话。
据我所知,您错误地调用了 curses.wrapper
函数。
来自 documentation:
curses.wrapper(func, ...)
初始化 curses 并调用另一个可调用对象 func,它应该是您使用 curses 的应用程序的其余部分。 (...) 然后将可调用对象 func 传递给主要 window ‘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,而是使用 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()
我是 运行 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
一些放大代码:
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
尝试在程序处于 运行 时退出该程序,则会显示异常,但终端仍处于混乱状态(包装器无法完成它的工作)。我在这里错过了一些明显的东西吗?
- 编辑 *
我确认这也发生在 Ubuntu 14.10 服务器版本上,通过远程 SSH 终端会话。
据我所知,您错误地调用了 curses.wrapper
函数。
来自 documentation:
curses.wrapper(func, ...)
初始化 curses 并调用另一个可调用对象 func,它应该是您使用 curses 的应用程序的其余部分。 (...) 然后将可调用对象 func 传递给主要 window ‘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,而是使用 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()