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

Python While循环故障:需每5分钟自动更新直至输入0,当前仅执行一次

问题分析与解决方案

你的循环之所以只执行一次就卡在等待输入,核心原因是当前代码把用户输入放在了循环的必经路径上——每次循环完成API请求和5分钟等待后,必须等用户输入才能进入下一轮循环。如果用户不输入,程序就会一直停在input()这一步,完全没法自动重复执行API更新逻辑。

下面给你两种实用的解决方案,适配不同场景:


方案一:多线程分离任务与输入监听(跨平台首选)

把自动更新API的逻辑放到一个单独的线程里运行,主线程专门用来监听用户输入。这样API循环会自动每5分钟执行一次,同时用户可以随时输入0来终止程序,互不干扰。

修改后的代码示例:

import requests
import json
import time
import threading

# 全局标志位,用来控制API循环的启停
stop_update = False

def usagePerUserApi(): 
    while not stop_update: 
        # 补全你的API地址和请求头
        url = "你的目标API地址"
        headers = {"你的请求头键值对"}
        
        resp = requests.get(url, headers=headers, verify=False) 
        data = json.loads(resp.content) 
        code = resp.status_code 
        Verbindungscheck.ausgabeVerbindungsCode(code) 
        print("---") 
        
        # 补全你的表头和表格处理逻辑
        head = ["表头1", "表头2"]  # 示例
        table = [] 
        for item in data['data']: 
            if item['un'] == tecNo: 
                table.append([item['字段1'], item['字段2']])  # 示例
        
        print("5分钟后将自动更新...")
        time.sleep(300) 

if __name__ == "__main__":
    # 启动API更新线程,设置为守护线程(主线程结束时自动退出)
    api_thread = threading.Thread(target=usagePerUserApi)
    api_thread.daemon = True
    api_thread.start()
    
    # 主线程监听用户输入
    print("程序已启动,输入0可停止自动更新")
    while True:
        user_input = input("To go back, enter 0: ")
        if user_input.strip() == "0":
            stop_update = True
            print("正在停止程序,请稍候...")
            break

这个方案的优点是逻辑清晰,Windows、Linux、macOS都能正常运行,而且不用处理复杂的非阻塞输入逻辑。


方案二:非阻塞输入监听(轻量无线程)

如果你不想用线程,可以用select模块(Unix/Linux/macOS友好,Windows需要额外调整)实现非阻塞输入——在等待5分钟的过程中,每秒钟检查一次是否有用户输入,既不耽误自动更新,又能随时响应用户的停止指令。

代码示例:

import requests
import json
import time
import sys
import select

def usagePerUserApi(): 
    stop = False
    while not stop: 
        # 补全API请求相关内容
        url = "你的目标API地址"
        headers = {"你的请求头键值对"}
        
        resp = requests.get(url, headers=headers, verify=False) 
        data = json.loads(resp.content) 
        code = resp.status_code 
        Verbindungscheck.ausgabeVerbindungsCode(code) 
        print("---") 
        
        head = ["表头1", "表头2"]  # 示例
        table = [] 
        for item in data['data']: 
            if item['un'] == tecNo: 
                table.append([item['字段1'], item['字段2']])  # 示例
        
        print("等待5分钟自动更新,或输入0立即停止:")
        # 分300次等待,每次1秒,期间检查是否有用户输入
        for _ in range(300):
            # 检查标准输入是否有内容
            if select.select([sys.stdin], [], [], 1)[0]:
                user_input = sys.stdin.readline().strip()
                if user_input == "0":
                    stop = True
                    break
            time.sleep(1)
        if stop:
            break

# 启动函数
usagePerUserApi()

注意:Windows系统上select模块对标准输入的支持有限,如果你用Windows,可以替换成msvcrt模块来实现非阻塞输入,核心逻辑类似。


额外提醒

  • 记得把代码中....的部分替换成你实际的业务逻辑(比如API地址、请求头、表头、表格字段等)。
  • 如果使用多线程方案,后续如果涉及到共享数据修改,需要注意线程安全(当前示例里只是读取和打印,不需要额外处理)。

内容的提问来源于stack exchange,提问作者Fabian Breuer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:18:35