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 查询并查看结果,所有这些都来自我的调试器。
是否可以?
我在调试 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()但它可以完成工作。希望将来能出现更优雅的解决方案。