如何实现按空格键暂停运行中脚本20秒并持续监听键盘输入?
实现脚本持续运行并监听空格键暂停的方案
没问题!我来帮你搞定这个需求——要让脚本一边持续运行,一边监听空格键触发“暂停20秒再恢复”的逻辑,关键是要做到非阻塞式的键盘输入监听,不然脚本会卡在等待输入的环节,没法正常持续运行。下面我用最常用的Python来给你具体方案:
方案1:使用第三方keyboard库(简单易实现)
这个库专门处理键盘监听,跨平台且API友好,先安装它:
pip install keyboard
然后是示例脚本,注释里写清楚每部分逻辑:
import keyboard import time import threading # 标记脚本是否处于暂停状态 is_paused = False def main_task(): """脚本的核心持续运行任务""" count = 0 while True: if not is_paused: print(f"脚本正在运行... 当前计数: {count}") count += 1 time.sleep(1) # 模拟任务的耗时操作 time.sleep(0.1) # 加个小延迟,避免占用过多CPU def listen_space_key(): """监听空格键,触发暂停/恢复逻辑""" global is_paused while True: # 监听空格键按下事件 keyboard.wait('space') if not is_paused: print("\n空格键被按下,开始暂停20秒...") is_paused = True time.sleep(20) print("暂停结束,恢复运行!") is_paused = False else: # 如果已经在暂停中,按下空格可以提前恢复(可选逻辑) print("\n提前恢复运行!") is_paused = False # 启动核心任务线程 threading.Thread(target=main_task, daemon=True).start() # 启动键盘监听线程 listen_space_key()
代码说明:
- 用多线程分开处理核心任务和键盘监听,这样两者不会互相阻塞
is_paused全局变量用来控制核心任务的运行状态- 空格键按下后,先标记暂停,等待20秒后自动恢复;如果暂停期间再按空格,还可以提前恢复(这个是可选的,你可以根据需求去掉)
方案2:使用标准库(无需第三方依赖)
如果不想安装第三方库,也可以用系统相关的标准库实现非阻塞监听:
Windows平台(使用msvcrt)
import msvcrt import time is_paused = False count = 0 while True: if not is_paused: print(f"脚本正在运行... 当前计数: {count}") count += 1 time.sleep(1) # 非阻塞检查键盘输入 if msvcrt.kbhit(): key = msvcrt.getch() # 空格键的ASCII码是32 if key == b' ': if not is_paused: print("\n空格键被按下,开始暂停20秒...") is_paused = True time.sleep(20) print("暂停结束,恢复运行!") is_paused = False else: print("\n提前恢复运行!") is_paused = False time.sleep(0.1)
Linux/macOS平台(使用termios和sys)
import sys import termios import tty import time def get_key(): """非阻塞获取键盘输入""" fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) key = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return key is_paused = False count = 0 while True: if not is_paused: print(f"脚本正在运行... 当前计数: {count}") count += 1 time.sleep(1) # 检查是否有按键输入 key = get_key() if key == ' ': if not is_paused: print("\n空格键被按下,开始暂停20秒...") is_paused = True time.sleep(20) print("暂停结束,恢复运行!") is_paused = False else: print("\n提前恢复运行!") is_paused = False time.sleep(0.1)
注意事项:
- 标准库方案需要区分操作系统,跨平台性不如
keyboard库 - 标准库的非阻塞监听逻辑相对繁琐,适合不想安装第三方包的场景
内容的提问来源于stack exchange,提问作者Norbert Ignácz
相关产品推荐
相关产品推荐

