Python调试时如何在控制台调用异步函数?
在PyCharm调试控制台调用异步函数的解决方案
问题描述
调试时习惯在控制台调用函数快速验证结果,但异步函数无法直接操作。示例代码如下:
import asyncio async def func1(): print('func1') def func2(): print('func2') async def main(): task = asyncio.create_task(func1()) await task # 在此处设置断点 asyncio.run(main())
在await task行设置断点后,控制台调用func2()可正常输出,但输入await task会触发错误:
File ".../anaconda3/lib/python3.9/asyncio/base_events.py", line 585, in _check_running raise RuntimeError( RuntimeError: Cannot run the event loop while another loop is running
环境:Python 3.9、PyCharm 2022.3.1
解决方法
可以通过以下几种方式实现调试控制台对异步函数的调用:
方法1:复用当前事件循环执行任务
在控制台输入以下代码,利用调试时已运行的事件循环来执行异步任务,避免启动新循环导致冲突:
import asyncio # 等待已创建的task asyncio.get_running_loop().run_until_complete(task) # 直接运行新的异步函数 asyncio.get_running_loop().run_until_complete(func1())
方法2:开启PyCharm异步调试支持
PyCharm 2020.1及以上版本支持直接在调试控制台使用await,需先配置:
- 打开
File > Settings > Build, Execution, Deployment > Python Debugger - 勾选
Asyncio debugging选项 - 重启调试会话后,即可直接在控制台输入
await func1()或await task执行
方法3:封装同步调用工具函数
如果需要频繁调用异步函数,可提前定义同步包装函数,调试时直接调用:
def sync_call_async(func, *args, **kwargs): import asyncio return asyncio.get_running_loop().run_until_complete(func(*args, **kwargs))
调试时输入sync_call_async(func1)即可执行异步函数func1。
内容的提问来源于stack exchange,提问作者cf1
相关产品推荐
相关产品推荐

