(Windows)FastAPIと一緒にasyncio.create_subprocess_shell()を使うとNotImplementedErrorが発生する原因・対処法
裏でシェルのコマンドを発行するものを作っていて、ハマったのでメモ。
環境はWindows10、Python3.8.2、FastAPI 0.63.0、uvicorn 0.13.2
NotImplementedError は名前の通り「未実装だよ!」という意味のエラー。
実はWindowsではProactorEventLoopを使っていないと、asyncio.create_subprocess_shell()を使用することができない。1
$uvicorn hoge.py:app
のように実行すると、SelectorEventLoopという異なる別のイベントループを使うようになっていて、結果上記の理由でエラーが発生した。
同じような境遇の人がFastAPIのGitHubリポジトリにissueをあげていて、そのissueに
「
from asyncio import ProactorEventLoop, set_event_loop, ProactorEventLoop, get_event_loop from uvicorn import Config, Server if __name__ == "__main__": set_event_loop(ProactorEventLoop()) server = Server(config=Config(app=app)) get_event_loop().run_until_complete(server.serve())
のようにして、python hoge.py
と実行すると良いよ」というコメントが付いていた。
これを試すと正常にasyncio.create_subprocess_shell()が使えるようになったので、とりあえず一件落着。