测试代码:
#!/bin/env python3
import signal
import time
def handle_sigint(signum, frame) -> None:
print("\nTerminate by user.\n")
exit(1)
signal.signal(signal.SIGINT, handle_sigint)
while 1:
time.sleep(1)
print(time.strftime('%F %T', time.localtime(time.time())))
Windows 下运行:
输出挺干净。
Linux 下运行:
输出多了一个
^C
, 不知道有没有办法解决。
在Python中,Ctrl+C
产生的是 SIGINT
信号。这个信号的默认行为是终止进程,并在shell中打印出 "^C"。
你可以通过设置一个信号处理器来改变 SIGINT
的默认行为,但是无法禁止其在shell中打印 "^C"。 这是因为 "^C" 是由shell(而不是你的Python程序)打印的。 当你按下 Ctrl+C
时,shell会给前台进程组发送 SIGINT
信号,并打印 "^C"。
如果你想要避免这一点,你可以使用其他方式退出程序。例如,你可以在程序中等待用户输入特定字符或字符串,然后调用 exit()
函数。
以下是一个例子:
#!/bin/env python3
import signal
import time
def handle_sigint(signum, frame) -> None:
print("\nTerminate by user.\n")
exit(1)
signal.signal(signal.SIGINT, handle_sigint)
while 1:
try:
input_str = input()
if input_str == 'exit':
print("\nTerminating...\n")
exit(0)
except Exception as e:
pass
time.sleep(1)
print(time.strftime('%F %T', time.localtime(time.time())))
运行这个程序,当你输入 "exit" 并按下回车键时,程序将退出,并显示 "Terminating..."。 注意,这个程序并没有捕获 SIGINT
信号,所以如果你按下 Ctrl+C
,它仍然会终止,并显示 "^C"。
因此,无法通过Python代码来阻止shell打印 "^C"。这是由shell控制的行为,而不是Python程序。
嗯。。不太行,增加用户输入脚本运行过程都改变了。
暂时用下面的方法解决了。
#!/bin/env python3
import signal
import time
def handle_sigint(signum, frame) -> None:
print("\r \r\nTerminate by user.\n")
exit(1)
signal.signal(signal.SIGINT, handle_sigint)
while 1:
time.sleep(1)
print(time.strftime('%F %T', time.localtime(time.time())))
遇到使用tqdm模块的时候还有可能需要上移光标 \033[A