[英]Async walk_blobs throws “object AccessToken can't be used in 'await' expression”
[英]python async upload_blob -- TypeError: object AccessToken can't be used in 'await' expression
我正在使用 Python 3.6.8 和以下軟件包:
azure-common 1.1.25
天藍色核心 1.3.0
天藍色身份 1.3.0
天藍色-nspkg 3.0.2
azure-storage-blob 12.3.0
我的代碼中的以下行:
await blobClient.upload_blob(data, overwrite=True)
給我一個帶有消息的堆棧跟蹤:
TypeError: object AccessToken can't be used in 'await' expression
如果我取消“等待”,代碼就可以正常工作,盡管它永遠不會將控制權交給其他任務,但它確實可以完美地上傳 blob。 我正在使用異步 upload_blob() 函數。 我不明白為什么我會收到這個錯誤,有什么想法嗎?
這是減去一些變量賦值的代碼:
from azure.identity import ClientSecretCredential
from azure.storage.blob.aio import BlobClient
import asyncio
import os
async def task(name, work_queue):
"""
"""
while not work_queue.empty():
f = await work_queue.get()
blobClient = BlobClient(
"https://{}.blob.core.windows.net".format(accountName),
credential = creds,
container_name = container,
blob_name = (f.replace(sourceDirPrefix, '')),
)
# Upload content to blob
with open(f, "rb") as data:
await blobClient.upload_blob(data, overwrite=True)
def main():
"""
This is the main entry point for the program
"""
# Create the queue of work
work_queue = asyncio.Queue()
# Put some work in the queue
for (path, dirs, files) in os.walk(sourceDir):
for f in files:
work_queue.put_nowait(os.path.join(path, f))
# Run the tasks
loop = asyncio.get_event_loop()
loop.run_until_complete(
asyncio.gather(
task("1", work_queue),
task("2", work_queue),
task("3", work_queue),
)
)
loop.close()
堆棧跟蹤:
Traceback (most recent call last):
File "test04.py", line 77, in <module>
main()
File "test04.py", line 70, in main
task("3", work_queue),
File "/usr/lib64/python3.6/asyncio/base_events.py", line 484, in run_until_complete
return future.result()
File "test04.py", line 44, in task
await blobClient.upload_blob(data, overwrite=True, asyncio=True)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/tracing/decorator_async.py", line 70, in wrapper_use_tracer
return await func(*args, **kwargs)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/storage/blob/aio/_blob_client_async.py", line 256, in upload_blob
return await upload_block_blob(**options)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/storage/blob/aio/_upload_helpers.py", line 79, in upload_block_blob
**kwargs)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/storage/blob/_generated/aio/operations_async/_block_blob_operations_async.py", line 207, in upload
pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 213, in run
return await first_node.send(pipeline_request) # type: ignore
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 91, in send
response = await self.next.send(request) # type: ignore
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 91, in send
response = await self.next.send(request) # type: ignore
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 91, in send
response = await self.next.send(request) # type: ignore
[Previous line repeated 3 more times]
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 89, in send
await _await_result(self._policy.on_request, request)
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/_base_async.py", line 62, in _await_result
return await result # type: ignore
File "/work/python/venv_sm_36/lib/python3.6/site-packages/azure/core/pipeline/policies/_authentication_async.py", line 37, in on_request
self._token = await self._credential.get_token(*self._scopes) # type: ignore
TypeError: object AccessToken can't be used in 'await' expression
在async def task(name, work_queue)
方法 -> 在這行代碼blobClient = BlobClient(xxx)
,您應該使用以下代碼:
async with blobClient:
with open(f, "rb") as data:
await blobClient.upload_blob(data, overwrite=True)
完成的方法:
async def task(name, work_queue):
"""
"""
while not work_queue.empty():
f = await work_queue.get()
blobClient = BlobClient(
"https://{}.blob.core.windows.net".format(accountName),
credential = creds,
container_name = container,
blob_name = (f.replace(sourceDirPrefix, '')),
)
async with blobClient:
with open(f, "rb") as data:
await blobClient.upload_blob(data, overwrite=True)
問題是您使用的身份類調用 BlobClient 的 ayncio 版本。 您必須使用身份類的異步版本。
所以你必須從這個改變:
from azure.identity import ClientSecretCredential
對此:
from azure.identity.aio import ClientSecretCredential
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.