在非异步上下文中访问循环属性
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.loop
在 sync
上下文中无法访问。 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())
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.loop
在 sync
上下文中无法访问。 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())