Pythonのasyncioでnon-blockingなコンソール入力を行うためのクラス
pythonでasyncioを使ったときにnon-blockingなコンソール入力(キーボード入力)ができなくて困ったので、実現するためのクラスを作ってみた。
もともと Linux用に作ったら、Windowsだとうまく動かない。
ちょっと汚い方法だけど、とりあえず動くようにしてお茶を濁しておく。
(あんまりテストしてないから動かなかったらごめん)
お試しならこのソースをそのまま実行すると実行できます。
char_mode = False
の部分を変更すると、1行入力モードと1文字入力モードを切り替えられます。
timeout_mode = True
の部分を変更すると、タイムアウトなしとタイムアウトありを切り替えられます。
実際に使用するには、このソースをimportして使ってください。
Linuxで1文字入力モードを使っている場合は、終了時(例外で死んだ場合も含めて)prompt.terminate()
を実行しないと悲しいことになります。
(ターミナルの入力モードが変更されてしまうので、うまく入力できなくなる)
そのために、atexit.retister()
で終了処理ルーチンを登録し、その中でprompt.terminate()
を実行するようにしています。
asyncioのサンプルって、タスク1個で動かしてることが多いからあんまり ありがたみが分からんのかな…
あと、タスクとコルーチンが同じように語られていて分かり難いのもあると思う。