(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と実行すると良いよ」というコメントが付いていた。

github.com

これを試すと正常にasyncio.create_subprocess_shell()が使えるようになったので、とりあえず一件落着。