首页 新闻 会员 周边

Python 如何正确捕获用户的 "Ctrl+C"?

0
悬赏园豆:50 [待解决问题]

测试代码:

#!/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, 不知道有没有办法解决。

YEUNGCHIE的主页 YEUNGCHIE | 菜鸟二级 | 园豆:360
提问于:2024-03-10 19:03
< >
分享
所有回答(2)
0

在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程序。

npe0 | 园豆:1299 (小虾三级) | 2024-03-11 14:24

嗯。。不太行,增加用户输入脚本运行过程都改变了。

支持(0) 反对(0) YEUNGCHIE | 园豆:360 (菜鸟二级) | 2024-03-11 19:03
0

暂时用下面的方法解决了。

#!/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())))
YEUNGCHIE | 园豆:360 (菜鸟二级) | 2024-03-11 20:28

遇到使用tqdm模块的时候还有可能需要上移光标 \033[A

支持(0) 反对(0) YEUNGCHIE | 园豆:360 (菜鸟二级) | 2024-03-11 21:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册