如何在 pdb 中等待协程

Lon*_*Rob 23 python pdb python-asyncio python-3.7

我正在使用一个异步库 ( asyncpg ),我想调试一些异步调用来查询数据库。

我放置了一个 pdb 断点并想尝试一些查询:

(pdb) await asyncpg.fetch("select * from foo;")
*** SyntaxError: 'await' outside function
Run Code Online (Sandbox Code Playgroud)

能够这样做会很棒,因为它允许我尝试一些 SQL 查询并查看结果,所有这些都来自我的调试器。

是否可以?

M.D*_*.D. 3

我在调试 aiofile 的使用时遇到了类似的问题。然后我找到了使用Nest_asyncio 的解决方案。例如,如果有以下异步示例脚本:

import asyncio
from aiofile import async_open
import nest_asyncio


async def main():
    async with async_open("/tmp/hello.txt", 'w+') as afp:
        await afp.write("Hello ")
        await afp.write("world")
        afp.seek(0)
        breakpoint()
        print(await afp.read())


if __name__=="__main__":
    loop = asyncio.get_event_loop()
    nest_asyncio.apply(loop)
    loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)

然后可以这样做:

-> print(await afp.read())
(Pdb) loop = asyncio.get_event_loop()
(Pdb) loop.run_until_complete(afp.read())
'Hello world'
(Pdb) 
Run Code Online (Sandbox Code Playgroud)

诚然,这有点乏味await asyncpg.fetch("select * from foo;")await afp.read()但它可以完成工作。希望将来能出现更优雅的解决方案。