Ошибка "botocore.exceptions.HTTPClientError..." в s3fs python

Всем привет!

Пытаюсь выполнить вот такой код с использованием библиотеки s3fs:

async def test_two():
try:
    loop = asyncio.get_running_loop()
    loop.close()
except Exception:
    print('No loop is running')
fs = s3fs.S3FileSystem(
    anon=True, endpoint_url=endpoint)
await fs.set_session()
ls = await fs.ls('test-reports/')
data = await fs.open('test-reports/test_new_fs.txt').read()
print(data)

Но в результате получают жирный трейс со следующим содержанием:

Traceback (most recent call last):
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\httpsession.py", line 208, in send
    response = await self._session.request(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiohttp\client.py", line 562, in _request
    conn = await self._connector.connect(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiohttp\connector.py", line 540, in connect
    proto = await self._create_connection(req, traces, timeout)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiohttp\connector.py", line 901, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiohttp\connector.py", line 1155, in _create_direct_connection
    hosts = await asyncio.shield(host_resolved)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Task <Task pending name='Task-2' coro=<_runner() running at C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\fsspec\asyn.py:56> cb=[_chain_future.<locals>._call_set_state() at C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\futures.py:394]> got Future <Future pending cb=[shield.<locals>._outer_done_callback() at C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\tasks.py:898]> attached to a different loop

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\IvanDanchuk\job_hunter\app\scrapers\repo.py", line 252, in <module>
    asyncio.run(test_two())
  File "C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "c:\Users\IvanDanchuk\job_hunter\app\scrapers\repo.py", line 247, in test_two
    ls = await fs.ls('test-reports/')
               ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\fsspec\asyn.py", line 118, in wrapper
    return sync(self.loop, func, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\fsspec\asyn.py", line 103, in sync
    raise return_result
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\fsspec\asyn.py", line 56, in _runner
    result[0] = await coro
                ^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\s3fs\core.py", line 985, in _ls
    files = await self._lsdir(path, refresh, versions=versions)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\s3fs\core.py", line 706, in _lsdir
    async for c in self._iterdir(
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\s3fs\core.py", line 756, in _iterdir
    async for i in it:
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\paginate.py", line 30, in __anext__
    response = await self._make_request(current_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\client.py", line 366, in _make_api_call
    http, parsed_response = await self._make_request(
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\client.py", line 391, in _make_request
    return await self._endpoint.make_request(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\endpoint.py", line 100, in _send_request
    while await self._needs_retry(
          ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\endpoint.py", line 262, in _needs_retry
    responses = await self._event_emitter.emit(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\hooks.py", line 66, in _emit
    response = await resolve_awaitable(handler(**kwargs))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\_helpers.py", line 15, in resolve_awaitable
    return await obj
           ^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\retryhandler.py", line 107, in _call
    if await resolve_awaitable(self._checker(**checker_kwargs)):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\_helpers.py", line 15, in resolve_awaitable
    return await obj
           ^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\retryhandler.py", line 126, in _call
    should_retry = await self._should_retry(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\retryhandler.py", line 152, in _should_retry
    return await resolve_awaitable(
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\_helpers.py", line 15, in resolve_awaitable
    return await obj
           ^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\retryhandler.py", line 174, in _call
    checker(attempt_number, response, caught_exception)
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\botocore\retryhandler.py", line 247, in __call__
    return self._check_caught_exception(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\botocore\retryhandler.py", line 416, in _check_caught_exception
    raise caught_exception
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\endpoint.py", line 181, in _do_get_response
    http_response = await self._send(request)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\endpoint.py", line 285, in _send
    return await self.http_session.send(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\aiobotocore\httpsession.py", line 259, in send
    raise HTTPClientError(error=e)
botocore.exceptions.HTTPClientError: An HTTP Client raised an unhandled exception: Task <Task pending name='Task-2' coro=<_runner() running at C:\Users\IvanDanchuk\AppData\Local\pypoetry\Cache\virtualenvs\job-hunter-P6MXXrsD-py3.11\Lib\site-packages\fsspec\asyn.py:56> cb=[_chain_future.<locals>._call_set_state() at C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\futures.py:394]> got Future <Future pending cb=[shield.<locals>._outer_done_callback() at C:\Users\IvanDanchuk\AppData\Local\Programs\Python\Python311\Lib\asyncio\tasks.py:898]> attached to a different loop

Окружение: Win11, fsspec 2023.9.2, s3fs 2023.9.2, python 3.11

Насколько я увидел по коду, fsspec, над которым написан s3fs, создает в отдельном потоке свой цикл событий и отправляет в него все свои корутины, в результате чего у нас есть два цикла событий - один, который создается командой asyncio.run, и второй, который создан под капотом s3fs. Как ни странно почему-то aibotocore в процессе выполнения узнает что есть ещё один цикл событий с крутящейся в нем задачей и выбрасывает исключение.

Сам вопрос: может кто сталкивался и может подсказать что сломано или как правильно запускать эту штуку? Или может рабочий код покажет в качестве примера с указанием версии s3fs. В ишью в репозитории s3fs подобного топика не увидел.


Ответы (0 шт):