如何在 cmd/python 中使用 Ctrl+C 禁用中断
How to disable interruption with Ctrl+C in cmd/python
我有一个程序有很多功能,每个 运行 在一个单独的线程上。
当用户按下Ctrl+C
时,只有1个线程异常崩溃,但正因为如此,整个程序可能无法正常运行。
当然,我可以在每个函数中写这个构造:
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
异常截图。
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
我有一个程序有很多功能,每个 运行 在一个单独的线程上。
当用户按下Ctrl+C
时,只有1个线程异常崩溃,但正因为如此,整个程序可能无法正常运行。
当然,我可以在每个函数中写这个构造:
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
异常截图。
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