<p><a href="https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/curses/__init__.py#L63" rel="nofollow noreferrer">curses.wrapper</a>的源代码对信号没有任何特殊之处。在</p>
<p>在初始化期间(例如对<a href="http://invisible-island.net/ncurses/man/curs_initscr.3x.html" rel="nofollow noreferrer">^{<cd1>}</a>的调用),ncurses库为这些信号添加处理程序:<code>SIGINT</code>,<code>SIGTERM</code>,<code>SIGTSTP</code>,<code>SIGWINCH</code>。无论出于什么原因(可能是因为它是一个内部细节,调用者无法直接看到),这主要记录在<a href="http://invisible-island.net/ncurses/NEWS.html" rel="nofollow noreferrer">^{<cd6>}</a>文件中。在</p>
<p>需要添加自己的信号处理程序的应用程序应该在ncurses初始化之后执行此操作(因为ncurses只执行一次)。因为curses应用程序可以切换到屏幕模式/从屏幕模式切换,信号处理程序将保持活动状态,直到程序退出。例如,Python脚本可以多次调用<code>curses.wrapper</code>(尽管它可能无法正常工作,除非ncurses X/Open声明“<a href="http://invisible-island.net/ncurses/man/curs_initscr.3x.html#h2-PORTABILITY" rel="nofollow noreferrer">portable applications must not
call <strong>initscr</strong> more than once</a>”)。在</p>
<p>按照<a href="https://stackoverflow.com/users/988828/lc2817">@lc2817</a>的建议保存和恢复信号处理程序状态是可行的,但这是一种解决办法,因为它不优雅。如果修改<code>curses.wrapper</code>以向其添加一些状态,以记住之前是否调用过它,并保存/恢复信号处理程序,则无需解决此问题。为了使其真正的可移植性,应该在第一次使用时调用<code>initscr</code>,在随后的使用中调用<code>refresh</code>。在</p>