在非异步上下文中访问循环属性

accesing loop attribute in non-async contexts

async def create_db_pool():
    database_url = ''
    client.pg_con = await asyncpg.create_pool(database_url, ssl="require")

所以我在我的 discord 机器人代码中有这个功能但是当我尝试 运行 这个代码使用

client.loop.run_until_complete(create_db_pool())

我收到以下错误,目前我正在寻找解决此问题的方法或任何解决方法

AttributeError: loop attribute cannot be accessed in non-async contexts. Consider using either an asynchronous main function and passing it to asyncio.run or using asynchronous initialisation hooks such as Client.setup_hook

您是否运行在同步上下文中设置您的机器人?代码应如下所示:

async def on_message(ctx): ...

另请出示一些代码。但我认为学习 asyncio 模块会有所帮助。无论如何,试试这个:

import asyncio


async def create_db_pool() -> None: ... # Your code


loop = asyncio.get_event_loop()
loop.run_until_complete(function_async())
loop.close()

这不会 运行 您的函数异步执行,但您似乎不希望这样做。但它实际上应该成功 运行 功能。

您必须使用 master 版本的 discord.py 它最近引入了 asyncio 的重大更改,其中之一就是这个。 client.loopsync 上下文中无法访问。 This gist 解释了变化是什么以及如何解决。

第一种方法是在 commands.Bot 子类中引入一个 setup_hook() 函数并在其中使用 await create_db_pool()

class MyBot(commands.Bot):
     def __init__(self, **kwargs):
         super().__init__(**kwarg)
         self.pg_conn: = None

     async def create_db_pool(self): # making it a bound function in my example
         database_url = ''
         self.pg_con = await asyncpg.create_pool(database_url, ssl="require")

     async def setup_hook(self):
         await self.create_db_pool() # no need to use `loop.run_*` here, you are inside an async function

或者您也可以在 main() 函数中执行此操作

async def main():
    await create_db_pool() # again, no need to run with AbstractLoopEvent if you can await
    await bot.start(TOKEN)

asyncio.run(main())