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
相关产品推荐
相关产品推荐

