web-dev-qa-db-ja.com

Pythonデバッガで非同期関数を待つ

Pythonデバッガー内でawait関数への任意の呼び出しをasyncすることは可能ですか?

いくつかの_main.py_ファイルに次のコードがあるとします。

_import asyncio

async def bar(x):
    return x + 1

async def foo():
    import ipdb; ipdb.set_trace()

asyncio.run(foo())
_

次に、デバッガー内で引数を指定してbar()を呼び出してテストし、結果をテストします。次のことが起こります。

_$ python3 main.py
> /Users/user/test/main.py(8)foo()
      7     import ipdb; ipdb.set_trace()
----> 8     return None
      9

ipdb> bar(1)
<coroutine object bar at 0x10404ae60>
main.py:1: RuntimeWarning: coroutine 'bar' was never awaited
  import asyncio
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
ipdb> await bar(1)
*** SyntaxError: 'await' outside function
_

もちろん、私はx = await bar(1)ipdb.set_trace()の上に置いて結果を検査することでこれを回避できますが、デバッガーが動作しているときにリアルタイムで関数を呼び出すことはできませんアクティブ。

11
Ivan Gozali

Python 3.8 以降、この機能のサポートが増え始めているようです。特に、この問題を見てください bpo-37028

あなたがまだPython 3.7を使用している場合は、多分 aiomonitor がこの機能をある程度サポートしている可能性があります。

1
Ivan Gozali