我在脚本中有api调用。然后脚本使用来自api调用的信息。我认为问题是有时脚本继续运行而不等待来自api调用的响应。以下是我认为是这种情况的原因:
示例1:我有一个脚本(cs.py),它通过api调用获取货币转换率并执行其他一些操作。有时当我运行这个脚本时,我得到一个如下所示的错误
aud_to_usd = requests.get('http://api.fixer.io/latest?base=AUD&symbols=USD').json()['rates']['USD']
...
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
示例2:我有一个脚本可以接收发票并使用tika提取文本(如果文本是可搜索的)或使用google vision ocr api提取文本。最终结果是格式化并输出到电子表格中的文本。 有时只有来自tika电话的文字出现在电子表格中,来自google api电话的信息都没有通过。
如果我在ipython中以增量方式运行脚本(例如,将每个api调用单独粘贴到终端并等待响应),则脚本可以正常工作。另外(正如我使用“#34;有时"”这个词暗示)只运行整个脚本有时会起作用。
这似乎是一个常见的问题。我是对的,api调用只是花了太长时间,脚本正在继续吗?有没有办法让脚本等到提供响应?例如,try-except尝试api调用,等待一段时间并在没有响应的情况下重新尝试调用?
(SO告诉我不要使用标签' api'但我想不出更合适的标签......)
答案 0 :(得分:0)
你走在正确的轨道上。你可以这样做:
exch_rate = None
while not exch_rate:
try:
resp = requests.get('http://api.fixer.io/latest?base=AUD&symbols=USD')
resp.raise_for_status()
exch_rate = resp.json()
except:
time.sleep(5)
您还可以防范超时:requests.get('http://github.com', timeout=0.001)
显然我会建议在几次尝试失败后退出while循环: - )