hotate29’s diary

Pythonや競プロ、趣味をつらつらと

(Windows)FastAPIと一緒にasyncio.create_subprocess_shell()を使うとNotImplementedErrorが発生する原因・対処法

裏でシェルのコマンドを発行するやつを作っていて、ハマったのでメモ

環境はWindows10、Python3.8.2、FastAPI 0.63.0、uvicorn 0.13.2

原因は使用するイベントループだった。Subprocessのドキュメントによると、WindowsではProactorEventLoopを使用している場合のみSubprocessを使う事ができるらしい(SeletcorEventLoopだとダメ)。

使っているイベントループを確認してみたら....

$ uvicorn fastapi_eventloop:app

<_WindowsSelectorEventLoop running=True .......>

oh.....

FastAPIのGitHubにて問題の解決に繋がりそうなissueが生えてた。このコメントによると以下のコードでイベントループをProactorEventLoopに変更できるらしい。

$ uvicorn hoge:fuga のような使い方はできなくなる。(普通に$ Python3 hoge.py と実行する)

Windows自体いい感じの環境ではないそうで、最高の状態で使いたい場合はLinuxを使ってね。とのこと(

https://github.com/tiangolo/fastapi/issues/1110#issuecomment-612966253