You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:13:19