Python TypeError: '_asyncio.Future' object is not subscriptable
Python TypeError: '_asyncio.Future' object is not subscriptable
下午好!我正在制作一个程序,需要使用 Python requests 库将 POST 10,000 张图像发送到 API。发送每个请求后,我收到一个带有哈希 (IpfsHash) 的响应,我需要将其写入以下形式的字典中:"Hash": "Number"。首先,我创建了一个简单的代码(使用循环而不使用异步)并且它有效。然后我使用异步来加快速度。
这是代码:
import asyncio
import requests
jsonHashes = {}
responses = []
def pinToIPFS(number):
url = 'https://api.pinata.cloud/pinning/pinFileToIPFS'
par = {
'pinata_api_key': 'blabla',
'pinata_secret_api_key': 'blabla'
}
file = {'file': open(str(number) + '.jpg', 'rb')}
res = requests.post(url, headers = par, files = file)
jsonHashes[res.json()['IpfsHash']] = number
print(res.json()['IpfsHash'] + ' = ' + str(number))
async def main():
loop = asyncio.get_event_loop()
futures = []
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(jsonHashes)
但是,由于某种原因,我得到了错误:
TypeError: '_asyncio.Future' object is not subscriptable
紧接着,我收到了对请求的回复:
QmcZR3cpeVzQ56gyWs83dRS51rtkqjyoF167paJMPrn32w = 1
QmehUERFcR6Erha6RtScDwfm1ACpZgGPrd5NNVnYWeDoH4 = 0
P.S。为简单起见,我放置了 2 次迭代而不是 10,000 次。
有问题的部分在这里:
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop.run_in_executor
returns 一个 asyncio.Future
对象,不是它们的列表。我不知道如何重写您的代码以使其工作 - 首先,我不熟悉 asyncio
,但主要是因为我认为根本不需要第二个 for 循环。
您必须以这种方式分离代码才能真正等待结果:
f = await futures[i]
json = f.json()['IpfsHash']
jsonHashes[json]
下午好!我正在制作一个程序,需要使用 Python requests 库将 POST 10,000 张图像发送到 API。发送每个请求后,我收到一个带有哈希 (IpfsHash) 的响应,我需要将其写入以下形式的字典中:"Hash": "Number"。首先,我创建了一个简单的代码(使用循环而不使用异步)并且它有效。然后我使用异步来加快速度。 这是代码:
import asyncio
import requests
jsonHashes = {}
responses = []
def pinToIPFS(number):
url = 'https://api.pinata.cloud/pinning/pinFileToIPFS'
par = {
'pinata_api_key': 'blabla',
'pinata_secret_api_key': 'blabla'
}
file = {'file': open(str(number) + '.jpg', 'rb')}
res = requests.post(url, headers = par, files = file)
jsonHashes[res.json()['IpfsHash']] = number
print(res.json()['IpfsHash'] + ' = ' + str(number))
async def main():
loop = asyncio.get_event_loop()
futures = []
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(jsonHashes)
但是,由于某种原因,我得到了错误:
TypeError: '_asyncio.Future' object is not subscriptable
紧接着,我收到了对请求的回复:
QmcZR3cpeVzQ56gyWs83dRS51rtkqjyoF167paJMPrn32w = 1
QmehUERFcR6Erha6RtScDwfm1ACpZgGPrd5NNVnYWeDoH4 = 0
P.S。为简单起见,我放置了 2 次迭代而不是 10,000 次。
有问题的部分在这里:
for i in range(2):
futures = loop.run_in_executor(None, pinToIPFS, i)
for i in range(2):
jsonHashes[await futures[i].json()['IpfsHash']] = i
loop.run_in_executor
returns 一个 asyncio.Future
对象,不是它们的列表。我不知道如何重写您的代码以使其工作 - 首先,我不熟悉 asyncio
,但主要是因为我认为根本不需要第二个 for 循环。
您必须以这种方式分离代码才能真正等待结果:
f = await futures[i]
json = f.json()['IpfsHash']
jsonHashes[json]