我有一个程序,有相当多的功能,每个运行在一个单独的线程。当用户按下Ctrl+C
时,只有一个线程崩溃,但由于这个原因,整个程序可能无法正常工作。
当然,我可以在每个函数中编写这个构造:
try:
do_something()
except KeyboardInterrupt as e:
pass
但是,正如我所说,有许多功能,也许有一种选择,不规定这种结构在每个功能?
还是可以在cmd设置中禁用Ctrl+C
中断?例如,在注册表中。程序在HKEY_CURRENT_USER\Console\MyProgrammKey
中创建自己的注册表项。
UPD 1
signal.signal(signal.SIGINT, signal.SIG_IGN)
在几乎所有情况下,它都起了作用,但只有一种例外:一个具有无限循环和input()
函数的线程无论如何都会中断。
UPD 2
下面是一个示例代码
import signal, time
from threading import Thread
def one():
while True:
inp = input("INPUT: ")
def two():
while True:
print("I just printing...")
time.sleep(1)
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal.SIG_IGN)
Thread(target=one).start()
Thread(target=two).start()
UPD 3
例外的截图。
发布于 2022-02-18 02:16:08
Ctrl+C
将向程序发送SIGINT
信号,因此您可以定义一个全局信号处理程序来忽略该SIGINT
,如下所示:
test.py:
import signal, os, time
def handler(signum, frame):
pass
signal.signal(signal.SIGINT, handler)
time.sleep(10)
print("done")
在程序运行期间,如果输入Ctrl+c
,程序将忽略它,并继续运行,最后打印done
。
$ python3 test.py
^Cdone
https://stackoverflow.com/questions/71167617
复制相似问题