Ошибка "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 подобного топика не увидел.