Python中如何通过按键在循环中途暂停程序并按需恢复?
解决方案:用线程实现爬虫的暂停/恢复功能
针对你的需求,推荐使用线程监听+全局状态标记的方案,既能实时响应暂停指令,又能确保当前循环任务完成后再进入暂停状态。以下提供两种可行实现方式:
方式一:按键触发暂停(适合工位操作)
使用keyboard库结合线程监听按键,按下指定键后标记暂停状态,当前循环结束后进入等待恢复状态。
步骤1:安装依赖
pip install keyboard
完整代码示例
import time import keyboard import threading # 全局暂停标记 paused = False # 自定义暂停按键(可修改为你习惯的按键,比如空格、ESC等) PAUSE_TRIGGER_KEY = 'p' def pause_listener(): global paused while True: # 检测按键按下,避免重复触发 if keyboard.is_pressed(PAUSE_TRIGGER_KEY): print('已触发暂停,当前任务完成后将暂停') paused = True # 等待按键松开,防止连续触发 while keyboard.is_pressed(PAUSE_TRIGGER_KEY): time.sleep(0.1) time.sleep(0.1) # 启动监听线程(守护线程,随主线程结束自动退出) listener_thread = threading.Thread(target=pause_listener, daemon=True) listener_thread.start() # 模拟你的爬虫主任务逻辑 def main_crawl_loop(): global paused while True: # 检查是否需要暂停 if paused: input('程序已暂停,按下回车键恢复运行...') paused = False # -------------------------- # 这里替换为你的Selenium/PyAutoGUI爬虫代码 print('开始执行单次爬虫任务') for i in range(1, 10): print(f'任务执行中:{i}/9') time.sleep(1) print('单次爬虫任务完成') # -------------------------- if __name__ == '__main__': main_crawl_loop()
说明
- 线程
pause_listener会实时监听按键,按下p后立即标记暂停状态,但不会打断当前正在执行的爬虫任务,只会在当前任务完成后进入暂停等待。 - Windows系统可能需要以管理员身份运行脚本才能正常监听按键,Linux/macOS可能需要
sudo权限。
方式二:文件标记触发暂停(适合远程/无人值守)
如果需要不在工位时控制程序,可通过检测特定文件的存在与否来触发暂停/恢复,无需按键操作。
完整代码示例
import time import os import threading paused = False # 用于标记暂停的文件路径 PAUSE_MARK_FILE = 'pause_flag.txt' def file_based_pause_listener(): global paused while True: # 检测暂停文件是否存在 if os.path.exists(PAUSE_MARK_FILE): if not paused: print('检测到暂停标记文件,当前任务完成后将暂停') paused = True else: if paused: print('暂停标记已移除,恢复运行') paused = False time.sleep(1) # 启动监听线程 listener_thread = threading.Thread(target=file_based_pause_listener, daemon=True) listener_thread.start() def main_crawl_loop(): global paused while True: if paused: print('程序已暂停,删除pause_flag.txt文件即可恢复') # 等待暂停标记移除 while paused: time.sleep(1) # -------------------------- # 替换为你的爬虫任务代码 print('开始执行单次爬虫任务') for i in range(1, 10): print(f'任务执行中:{i}/9') time.sleep(1) print('单次爬虫任务完成') # -------------------------- if __name__ == '__main__': main_crawl_loop()
说明
- 需要暂停时,创建
pause_flag.txt文件;需要恢复时,删除该文件即可。 - 适合远程操作场景,比如通过FTP、远程桌面等工具修改文件状态来控制程序。
内容的提问来源于stack exchange,提问作者Stephen Cook
相关产品推荐
相关产品推荐

