どうもお久しぶりです。

最近はめっきり更新が減ってしまった筆者です。
Valorantやら子供と原神というゲームにハマっていたわけなので、生きています笑

さて、久しぶりの今回はタイトルのPythonプログラミングネタ。

どうしてもLinuxを触っているとコンソール端末上で動作するアプリケーションに出会いますよね。
みなさんもご存知の有名なコマンドで言えば、psやtopですかね。

Linuxで有名なコンソールアプリ

以下はtopコマンド。

筆者はtopの拡張版のhtopをよく使います。

そして最近はytopとかも出てきていますね。

こちらはrustという言語で書かれているようですね。


Pythonでコンソールアプリを作るには?

さてさて、このようなコンソールアプリをPythonで作るにはどうしたらいいのでしょうか?

となるわけですが、Pythonではcursesという標準ライブラリを使います。

以下のサイトを見ながら試しにコーディング。
Python で Curses プログラミング

Sample1


#!/usr/bin/python3
import curses
from curses import wrapper
#
def main(stdscr):

        stdscr = curses.initscr()
        curses.noecho()
        stdscr.clear()

        hello="Hello,Curses World!!"

        stdscr.addstr(0,0,hello)
        stdscr.addstr(1,0,hello,curses.A_REVERSE)
        stdscr.addstr(3,0,'Hit any key',curses.A_BLINK)

        stdscr.keypad(True)
        stdscr.refresh()
        stdscr.getkey()
wrapper(main)

上記を実行するとコンソール内がクリアされ、Hello,Curses World!!がテキスト表示され、Hit any keyが点滅します。何かキーを押すと戻ります。

        hello="Hello,Curses World!!"
  
        stdscr.addstr(0,0,hello)
        stdscr.addstr(1,0,hello,curses.A_REVERSE)
        stdscr.addstr(3,0,'Hit any key',curses.A_BLINK)

curses.A_REVERSEでテキストを反転装飾しています。
curses.A_BLINKはテキスト点滅です。

それでは次は少しメニューのようなものを付け足してみましょう。

Sample2


#!/usr/bin/python3
import curses
from curses import wrapper
#
def main(stdscr):

        stdscr = curses.initscr()
        curses.noecho()
        stdscr.clear()

        hello="Hello,Curses World!!"

        stdscr.addstr(0,0,hello)
        stdscr.addstr(1,0,hello,curses.A_REVERSE)
        stdscr.addstr(3,0,'[1] Reset / [2] Reboot / [p] Print / [q] Quit')
        stdscr.addstr(5,0,'Hit any key',curses.A_BLINK)
        stdscr.keypad(True)
        stdscr.refresh()
        stdscr.getkey()

        while True:
                c=stdscr.getch()
                if c==ord('1'):
                        stdscr.clear()
                        stdscr.addstr(0,0,'[1] Reset pushed !')
                        stdscr.addstr(3,0,'[1] Reset / [2] Reboot / [p] Print / [q] Quit')
                        stdscr.addstr(5,0,'Hit any key',curses.A_BLINK)
                        stdscr.refresh()
                elif c==ord('2'):
                        stdscr.clear()
                        stdscr.addstr(0,0,'[2] Reboot pushed !')
                        stdscr.addstr(3,0,'[1] Reset / [2] Reboot / [p] Print / [q] Quit')
                        stdscr.addstr(5,0,'Hit any key',curses.A_BLINK)
                        stdscr.refresh()
                elif c==ord('p'):
                        stdscr.clear()
                        stdscr.addstr(0,0,'[p] Print pushed !')
                        stdscr.addstr(3,0,'[1] Reset / [2] Reboot / [p] Print / [q] Quit')
                        stdscr.addstr(5,0,'Hit any key',curses.A_BLINK)
                        stdscr.refresh()
                elif c==ord('q'):
                        break

wrapper(main)

c=stdscr.getch()で押されたキーに応じて命令が分岐できます。

これがわかれば、何か便利なツールが作れそうですね。

これまでに筆者が紹介したコマンドレベルの作業も毎回行うと手間になるので、
メニュー化して、URLの入力を促すようにするだけで後は裏で処理するとかもできそうですよね。


まとめ

今回はPythonでCursesを使ってコンソールアプリを作って遊んでみました。
仕掛けがわかったかと思います。

他の言語でもcursesライブラリを使えば同様なことができそうですよね。

ただ、コンソールアプリってLinux使いがリモートでsshするときくらいしか需要がなさそうなので・・・、なかなか一般の方よりはエンジニアじゃないと興味が湧くような機会が無さそうではありますが、何かの参考になれば幸いです。

というわけで久しぶりのネタはPythonでした。

そろそろ次期macOSであるVenturaのHackintoshネタもやっていかないとですね。