今日も読みに来てくださって、ありがとうございます。今回は、Pythonのお話です。
Pythonでファイルの更新とキー入力待ちを同時にチェックしたいという要望がありました。ファイルの更新チェックは、新しいデータが記録されたのを抜き出したい、ということで、更新確認は、前回タイムスタンプと今回タイムスタンプが異なっていれば、何らかの更新があった、という判断で対応できました。その更新チェックをしながら、キー入力待ちを同時にやりたい、という要望です。
通常Pythonでキー入力を受け付けるというと、「input()
」が思いつきます。こんな感じですね。
>>> a = input('Hit any key:')
Hit any key:aaa
>>> print(a)
aaa
ただこれだと、「input()
」が実行されると先に進まなくなって、待ち状態になってしまいます。そうすると、ファイルのタイムスタンプが更新されたらデータを読み込むという処理をしながらキー入力待ちができないのです。そう、やりたいのは、かつてBASICでINKEY$
というコマンドで実装していたように、その関数が実行された時に入力されたキーを知りたい、ということです。調べてみるといろんなやり方があるようでしたが、中でも簡単に実装できたやつをメモしておきます。blessedというモジュールに入っている、Terminalを利用します。「input()
」は標準モジュールに含まれていますが、blessed
は標準モジュールではないのでpipでインストールする必要があります。
pip install blessed
このblessed
は、cursesモジュールという文字セル表示を扱うためのライブラリをより簡単に使えるようラップしたものだそうです。cursesは、Unix端末で主に利用されているcursesライブラリのインターフェースということでした。もっと簡単に言うと、CUIのインターフェースをうまく扱えるようにするために使えるライブラリですね。
インストールできたので、さっそく使ってみます。
from blessed import Terminal
t = Terminal()
with t.cbreak():
while True:
k = t.inkey(timeout=0.001)
if not k :
pass
elif k.is_sequence:
if k.name == 'KEY_ESCAPE':
break
print(f'"{k.name}"が押されました。終了するには「ESC」キーを押してください。')
else:
print(f'"{k}"が押されました。終了するには「ESC」キーを押してください。')
これでESCキーが押されるまでループを繰り返すようになりました。合間にファイルのタイムスタンプ更新チェックを入れれば要望通りのことができます。
ただ、このスクリプトの実行に、ぼくの環境ではCPUの使用率が35%ほどかかっていました。もしこれが問題で、使用率を下げたいなら、timeモジュールのsleepを上記のpassのところに記載するとよいでしょう。試しにぼくの環境で入れてみましたが、sleep(0.1)と入れるだけで、CPU使用率が2.5~3%ほどに下がりました。単純にループしてるだけなのに、sleepしないとCPU使用率って意外とかかるのですね。