簡體   English   中英

python async upload_blob -- TypeError: object AccessToken 不能用在“await”表達式中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM