当我在OSX或Linux上运行以下代码,然后按ctrl+c
时,会启动一个“优雅关闭”。看起来像这样:
$ python subprocess_test.py
Subprocess: <MyProcess(MyProcess-1, started)>
^CMain: Graceful shutdown
Subprocess: shutdown
但是,当我在Windows10机器上运行一些代码时,keyboardInterrupt
会在self.event.wait()
行中引发,从而阻止正常关闭。我尝试了不同的方法,如here所述,以防止子进程接收到信号。在
使用Python2.7在不同的操作系统上获得相同行为的正确方法是什么?在
^{pr2}$
使用来自pywin32的
win32api.SetConsoleCtrlHandler
可以控制窗口如何中断。使用SetConsoleCtrlHandler(None, True)
会导致调用进程忽略CTRL+C输入。使用SetConsoleCtrlHandler(sighandler, True)
可以注册特定的处理程序。在综上所述,问题是这样解决的:
在Windows上,} 来忽略父进程中的Ctrl+C
SIGINT
是使用CTRL_C_EVENT
的控制台控制事件处理程序实现的。子进程继承的是控制台状态,而不是CRT的信号处理状态。因此,如果希望子进程忽略Ctrl+C,则需要在创建子进程之前首先调用^{有一个陷阱。Python在Windows上不使用警报等待,比如process
join
方法中的wait。因为它在主线程上分派信号处理程序,所以主线程在join()
中被阻塞这一事实意味着永远不会调用信号处理程序。必须用time.sleep()
上的一个循环来替换join,这是可以由Ctrl+C中断的,因为它在内部等待一个Windows事件,并设置自己的控制处理程序来设置这个事件。或者您可以使用您自己的异步控制处理程序集通过ctypes。下面的示例实现了这两种方法,并且在Python2和3中都能工作。在相关问题 更多 >
编程相关推荐