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

PycURL循环获取API调用状态异常问题求助

问题解决方法

你的代码核心问题是循环内没有重新调用API获取最新状态,只是反复读取第一次请求的缓存数据,同时BytesIO对象没有重置,导致无法正确解析新响应。以下是修复后的代码:

import pycurl
import io
import json
import time

def get_task_status():
    curl_obj = pycurl.Curl()
    b_obj = io.BytesIO()
    sddcMurl = "https://sddc-mgmt.rainpole.dev/v1/credentials/tasks/fc8dc930-f762-45b9-840e-96bf187dca40"
    headers = [
        'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI1ZjlhOWM0YS03ZjYzLTRkNDQtODI4Mi1hYjQ3ODNmNzYyYTQiLCJpYXQiOjE2OTU4Mjg4NjYsInN1YiI6ImFkbWluaXN0cmF0b3JAdnNwaGVyZS5sb2NhbCIsImlzcyI6InZjZi1hdXRoIiwiYXVkIjoic2RkYy1zZXJ2aWNlcyIsIm5iZiI6MTY5NTgyODg2NiwiZXhwIjoxNjk1ODMyNDY2LCJ1c2VyIjoiYWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2FsIiwibmFtZSI6ImFkbWluaXN0cmF0b3JAdnNwaGVyZS5sb2NhbCIsInNjb3BlIjpbIlJFU09VUkNFX0ZVTkNUSU9OQUxJVFlfV1JJVEUiLCJMSUNFTlNJTkdfSU5GT19SRUFEIiwiU0REQ19GRURFUkFUSU9OX1dSSVRFIiwiQVZOX1dSSVRFIiwiU0REQ19NQU5BR0VSX1JFQUQiLCJDRVJUX1dSSVRFIiwiQ09NUE9TQUJJTElUWV9XUklURSIsIkxJQ0VOU0VfS0VZX1JFQUQiLCJDT01QT1NBQklMSVRZX1JFQUQiLCJFREdFX0NMVVNURVJfV1JJVEUiLCJVU0VSX1JFQUQiLCJDUkVERU5USUFMX1dSSVRFIiwiQkFDS1VQX0NPTkZJR19SRUFEIiwiQ0xVU1RFUl9XUklURSIsIkFWTl9SRUFEIiwiVkFTQV9QUk9WSURFUl9SRUFEIiwiRE9NQUlOX1dSSVRFIiwiQ0VJUF9SRUFEIiwiU09TX1dSSVRFIiwiU0REQ19NQU5BR0VSX1dSSVRFIiwiTlRQX1dSSVRFIiwiVEFHX1dSSVRFIiwiREVQT1RfQ09ORklHX1dSSVRFIiwiU1lTVEVNX1JFQUQiLCJERVBPVF9DT05GSUdfUkVBRCIsIkhPU1RfV1JJVEUiLCJSRVNPVVJDRV9MT0NLX1dSSVRFIiwiQkFDS1VQX1JFU1RPUkVfUkVBRCIsIkNFUlRfUkVBRCIsIlVTRVJfV1JJVEUiLCJVUEdSQURFX1JFQUQiLCJPVEhFUl9SRUFEIiwiU09TX1JFQUQiLCJTRUNVUklUWV9DT05GSUdfUkVBRCIsIkNSRURFTlRJQUxfUkVBRCIsIkhPU1RfUkVBRCIsIkNFSVBfV1JJVEUiLCJSRVNPVVJDRV9MT0NLX1JFQUQiLCJPVEhFUl9XUklURSIsIkxJQ0VOU0VfS0VZX1dSSVRFIiwiUkVTT1VSQ0VfRlVOQ1RJT05BTElUWV9SRUFEIiwiQ0FfUkVBRCIsIlRBR19SRUFEIiwiTkVUV09SS19QT09MX1dSSVRFIiwiV0NQX1JFQUQiLCJMSUNFTlNJTkdfSU5GT19XUklURSIsIkJBQ0tVUF9SRVNUT1JFX1dSSVRFIiwiTlRQX1JFQUQiLCJFREdFX0NMVVNURVJfUkVBRCIsIkJBQ0tVUF9DT05GSUdfV1JJVEUiLCJXQ1BfV1JJVEUiLCJTRVJWSUNFX0FDQ09VTlRfV1JJVEUiLCJORVRXT1JLX1BPT0xfUkVBRCIsIkNBX1dSSVRFIiwiQ0xVU1RFUl9SRUFEIiwiVkFTQV9QUk9WSURFUl9XUklURSIsIkROU19XUklURSIsIlZSU0xDTV9XUklURSIsIkROU19SRUFEIiwiU0VSVklDRV9BQ0NPVU5UX1JFQUQiLCJTRERDX0ZFREVSQVRJT05fUkVBRCIsIkRPTUFJTl9SRUFEIiwiVlJTTENNX1JFQUQiLCJVUEdSQURFX1dSSVRFIl0sInJvbGUiOlsiQURNSU4iXX0.y0VpHMF4xkFhZZTsckn9nG-QF6tZtn96JAhRjacHP40'
    ]
    
    curl_obj.setopt(curl_obj.URL, sddcMurl)
    curl_obj.setopt(curl_obj.WRITEDATA, b_obj)
    curl_obj.setopt(curl_obj.SSL_VERIFYHOST, False)
    curl_obj.setopt(curl_obj.SSL_VERIFYPEER, False)
    curl_obj.setopt(curl_obj.HTTPHEADER, headers)
    
    curl_obj.perform()
    response = b_obj.getvalue()
    jsonobj = json.loads(response)
    
    curl_obj.close()
    b_obj.close()
    
    return jsonobj

# 初始获取状态
jsonobj = get_task_status()
apicallstatus = jsonobj['status']
print(f"Initial status: {apicallstatus}")

startTime = time.time()

if apicallstatus != 'FAILED':
    while apicallstatus in ['IN_PROGRESS']:
        # 等待5秒后重新获取最新状态
        time.sleep(5)
        jsonobj = get_task_status()
        apicallstatus = jsonobj['status']
        
        print(f"Current status: {apicallstatus}")
        if 'subTasks' in jsonobj and len(jsonobj['subTasks']) > 0:
            print(f"Subtask status: {jsonobj['subTasks'][0]['status']}")
        
        # 检查是否成功,退出循环
        if apicallstatus == 'SUCCESS':
            print("Task completed successfully!")
            break
else:
    print(f"Job has failed because of {jsonobj['errors'][0]['errorCode']} and {jsonobj['errors'][0]['message']}")

关键修改说明

  • 封装API请求为函数:把获取任务状态的逻辑封装成get_task_status(),每次调用都会重新创建Curl和BytesIO对象,彻底避免缓存旧数据
  • 循环内重新调用API:在while循环中,每次等待后都会调用函数重新拉取最新状态,而非读取第一次请求的缓存
  • 增加SUCCESS状态处理:当状态变为SUCCESS时,打印提示并主动退出循环
  • 增加空值安全判断:访问subTasks前先检查存在性,避免出现KeyError异常

内容的提问来源于stack exchange,提问作者preetam vmw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:02:09