Python製CLIフレームワーク「cmd2」— タブ補完・argparse連携・スクリプト自動化を標準装備

タグ cmd2Python CLIタブ補完argparse連携対話型シェルCLIフレームワークスクリプト自動化columnコラムlinuxLinuxwindowsWindowsmacosmacOSGitHubオープンソースpython-cmd2
🚀 今すぐ試せます! デモスクリプトをダウンロードして、解凍後にターミナルで bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。 (macOS / Linux 環境が必要)

Python製CLIフレームワーク「cmd2」— タブ補完・argparse連携・スクリプト自動化を標準装備

ひとことでいうと

cmd2 は、Python(プログラミング言語)で対話型のコマンドラインツールを手軽に作れるフレームワーク(アプリ開発の土台となるライブラリ)です。「コマンドを打ち込むと動くシェル」を自分で作るための仕組みで、タブキーでのコマンド補完・入力履歴の管理・スクリプト(手順書)の自動実行など、本格的な CLI(文字で命令を送る操作画面)ツールに必要な機能が最初から揃っています。Python 3.10 以降であれば Windows・macOS・Linux のどの OS でも動き、外部ライブラリへの依存が少ないのでインストールも簡単です。開発者は「コアとなるロジックだけ」を書けばよく、面倒なインターフェース部分は cmd2 が受け持ってくれます。

こんな人におすすめ

  1. サーバー管理やデプロイ作業をチームで共有したいエンジニア: よく使う操作をコマンド化してシェルにまとめれば、タブ補完でミスが減り、エイリアス(長いコマンドの短縮名)で作業スピードも上がります。チーム全員が同じ手順を使えるようになるため、ヒューマンエラーの防止にもつながります。

  2. データ処理を対話形式で行いたい研究者・分析者: Jupyter Notebook(ノートブック形式の分析環境)ほど重くなく、普通のコマンドラインよりも使いやすい「ちょうど中間」のツールを作れます。run_pyscript という機能を使えば、既存の Python スクリプトをそのまま取り込むこともできます。

  3. セキュリティツールや診断ツールを開発する方: NVIDIA の LLM 脆弱性スキャナ「garak」や CrowdStrike の Falcon Toolkit など、著名なプロジェクトが cmd2 を本番環境で採用しています。複雑なサブコマンド(コマンドの下に用意された細分化されたコマンド)も素早く実装できるため、規模が大きなツールの開発にも向いています。

インストール・使い方

Step 1: cmd2 をインストールする

ターミナル(文字で命令を送る画面。Mac では「ターミナル」、Windows では「コマンドプロンプト」や「PowerShell」)を開き、次のコマンドを実行します。コピー&ペーストでそのまま使えます。

pip install -U cmd2

pip は Python のパッケージ(追加機能の詰め合わせ)をインストールする公式ツールです。Python 3.10 以降が必要で、外部への依存が少ないためインストールは数秒で終わります。

Step 2: 最小構成のアプリを作る

次の内容を app.py というファイル名で保存してください。

#!/usr/bin/env python
"""A simple cmd2 application."""
import cmd2

class FirstApp(cmd2.Cmd):
    """A simple cmd2 application."""

    def do_hello_world(self, _: cmd2.Statement):
        self.poutput('Hello World')

if __name__ == '__main__':
    import sys
    c = FirstApp()
    sys.exit(c.cmdloop())

cmd2.Cmd を継承(もとのクラスの機能を引き継ぐこと)した FirstApp クラスを作り、do_hello_world というメソッドを定義するだけで hello_world コマンドが使えるようになります。do_ で始まるメソッドが自動的にコマンドとして登録される、というのが cmd2 の基本的な仕組みです。

Step 3: 実行して動かす

python app.py

(Cmd) というプロンプト(入力を促す文字)が表示されたら起動成功です。hello_world と入力して Enter を押すと Hello World と表示されます。Tab キーでコマンドが補完され、help で一覧を確認できます。終了するには quit と入力するか Ctrl+D を押してください。

Step 4: argparse と連携してコマンドを強化する

argparse(Python 標準の引数解析ライブラリ)と組み合わせると、コマンドへの引数追加・タブ補完・ヘルプ文の自動生成がまとめて実現できます。

import cmd2
import argparse

class MyApp(cmd2.Cmd):
    greet_parser = argparse.ArgumentParser()
    greet_parser.add_argument('name', help='Your name')
    greet_parser.add_argument('--upper', action='store_true', help='Uppercase output')

    @cmd2.with_argparser(greet_parser)
    def do_greet(self, args):
        msg = f'Hello, {args.name}!'
        self.poutput(msg.upper() if args.upper else msg)

if __name__ == '__main__':
    import sys
    app = MyApp()
    sys.exit(app.cmdloop())

@cmd2.with_argparser(greet_parser) というデコレータ(関数に追加機能を付ける記述)を一行書き加えるだけで、greet <Tab> で引数のヒントが表示され、help greet で自動生成された使い方の説明が確認できます。

ブラウザで試す(デモ)

インストールなしでも、ブラウザ上から cmd2 アプリのコマンド処理を体験できます。helloaddupperreverse といったコマンドを実際に入力することで、cmd2 がどのようにコマンドを解析・実行するかを確認できます。まず動きを見てから手元で試したいときに便利な方法です。

動かしてみた

PyPI(Python の公式パッケージ配布サイト)経由のインストールはスムーズに完了しました。Python 3.10 以降の環境であれば、README に掲載されている Hello World アプリを即座に動かすことができます。

cmdloop() を呼び出すとインタラクティブシェルが起動し、自分で定義したコマンドに加えて、組み込みの helpsetquitrun_script などが最初から使えるようになります。

$ python app.py
(Cmd) hello_world
Hello World
(Cmd) help

Documented commands (use 'help -v' for verbose/'help <topic>' for details):
======================================
hello_world

Undocumented commands:
======================
alias  edit  help  history  macro  quit  run_pyscript  run_script  set  shell  shortcuts
(Cmd) quit

help コマンドを実行すると、自分が定義したコマンドと cmd2 の組み込みコマンドが一覧で表示されます。alias(短縮名)・history(入力履歴)・run_script(スクリプト実行)など、追加コードを書かなくても最初から多くの機能が使える点が大きな強みです。

実践のコツ:はじめの一歩を踏み出すために

すぐ試せる行動と、つまずきにくくするためのポイントをまとめました。

  • まず hello_world を動かす: Step 2 のコードをそのままコピーして実行してみましょう。動いた感触をつかんだら、メソッド名を変えて自分のコマンドを一つ追加するだけで応用が広がります。
  • コマンド名は do_ から始める: do_xxxx という名前のメソッドを書くだけで自動登録されます。do_statusdo_deploy のように業務に即した名前にすると、後から見返しやすいです。
  • poutput()print() の代わりに使う: cmd2 では出力に self.poutput() を使うと、パイプ処理(出力を別のコマンドに渡すこと)やリダイレクト(出力先を変えること)に自動で対応できます。
  • @with_argparser を早めに導入する: コマンドの引数が増えてきたタイミングで argparse 連携に切り替えると、タブ補完とヘルプ生成が自動でついてきます。
  • run_script でテストを自動化する: よく使う一連のコマンドをテキストファイルに書いておき、run_script ファイル名 で実行できます。CI/CD(継続的なテスト・デプロイの仕組み)での動作確認にも活用できます。
  • choices_provider で動的補完に挑戦する: データベースのテーブル名やホスト名など、実行時に変わる値を補完候補にしたい場合に使える機能です。慣れてきたら試してみてください。

用語とポイント解説

cmd(Python 標準モジュール)

Python に最初から付属している、コマンドライン作成の土台となるモジュールです。かんたんに言うと「対話型シェルを作るための標準セット」です。cmd2 はこれを大幅に拡張したライブラリで、cmd 単体では難しかった機能を簡単に追加できます。

フレームワーク

アプリを作るための「骨格」や「土台」のことです。かんたんに言うと「よく使う仕組みをまとめて用意してくれた便利な道具箱」です。自分でゼロから作らなくても、フレームワークの決まりに沿って書くだけで機能が完成します。

cmdloop

ユーザーの入力を受け付けてコマンドを実行し続けるメインのループ(繰り返し処理)です。かんたんに言うと「アプリが『終了』と言われるまで待ち続けてコマンドをさばく心臓部」です。sys.exit(c.cmdloop()) と書くと、終了コード(正常終了か異常終了かを伝える番号)も正しく呼び出し元へ伝わります。

Statement

cmd2 がユーザーの入力を解析して作るオブジェクト(データの入れ物)です。かんたんに言うと「入力文字列を分解して整理したもの」で、コマンド名・引数・パイプ先などの情報がまとまっています。do_xxxx(self, statement) の第二引数として受け取ります。

argparse

Python 標準の引数(コマンドに渡す追加情報)解析ライブラリです。かんたんに言うと「コマンドへの入力をルール通りに整理してくれる仕組み」です。cmd2 の @with_argparser デコレータと組み合わせると、タブ補完・入力チェック・ヘルプ生成が自動でできます。

with_argparser(デコレータ)

argparse の ArgumentParser を cmd2 のコマンドに紐付けるデコレータです。かんたんに言うと「コマンドに引数の設定をくっつけるおまじない」で、これを一行書き加えるだけでタブ補完とヘルプ文が自動生成されます。

タブ補完

Tab キーを押すと入力途中のコマンドや引数を自動で補完してくれる機能です。かんたんに言うと「途中まで打てば残りを代わりに入力してくれる時短機能」です。コマンドのつづりを覚えていなくてもミスなく入力できるため、操作ミスの防止に大きく役立ちます。

エイリアス

長いコマンドに短い別名を付ける機能です。かんたんに言うと「コマンドのニックネーム」です。cmd2 では alias create コマンドでその場で定義でき、よく使う操作を素早く呼び出せるようになります。

run_script / @@

テキストファイルに書かれたコマンドを順番に実行するスクリプト機能です。かんたんに言うと「コマンドの手順書をそのまま自動実行する機能」です。@@ はネスト(スクリプトの中からさらに別スクリプトを呼ぶこと)にも対応しており、複雑な自動化ワークフローを組むことができます。

poutput

cmd2 独自の出力メソッドです。かんたんに言うと「cmd2 の世界に最適化された print() の代わり」です。パイプ処理やリダイレクトに対応しており、cmd2 アプリではなるべく print() よりもこちらを使うのが推奨されています。

choices_provider

タブ補完の候補を動的(実行時に変わる内容)で提供するための仕組みです。かんたんに言うと「補完リストをリアルタイムで生成できる機能」です。データベースのテーブル名やファイル一覧など、あらかじめ固定できない候補を補完に使いたいときに役立ちます。

活用アイデア

  • データベース管理シェル: do_connectdo_querydo_export などのコマンドを定義し、DBA(データベース管理者)が日常的に使う操作を対話型シェルにまとめます。history コマンドで過去の操作を再実行でき、エイリアスで長いコマンドを短縮することも可能です。

  • CI/CD デプロイ自動化: run_script を使ってテキストファイルにコマンドの手順を記述すれば、再現性の高いデプロイ手順書を作れます。スクリプトファイルは Git などでバージョン管理できるため、チームでの共有にも向いています。

  • 教育・チュートリアルツール: set コマンドで設定値をその場で変えながら動作の変化を確認できるため、API の学習ツールや設定ウィザード(手順に沿って設定を進めるもの)として活用できます。poutput のカラー出力機能でフィードバックを視覚的に強調することも可能です。

  • セキュリティ診断フレームワーク: NVIDIA や CrowdStrike の事例のように、複数のサブコマンドを持つ診断・スキャンツールの骨格として使えます。argparse 連携で引数の検証とヘルプ生成を自動化できるため、ツール全体の品質が向上します。

  • 個人用クラウド・サーバー管理ツール: 自分のサーバーやクラウドリソースを操作する専用シェルを作れます。よく使う操作を do_xxxx として登録しておくだけで、API クライアントや SSH コマンドを毎回打ち込まなくて済むようになります。

  • 研究・分析の対話環境: データの読み込み・集計・出力を対話的に行うツールを作れます。Jupyter が重すぎる環境でも軽快に動作し、run_pyscript で既存の Python スクリプトをそのまま取り込んで活用できます。


cmd2 は、Python の cmd モジュールのシンプルさを残しながら、プロダクション品質(実際の業務で使える水準)の CLI フレームワークとして必要な機能をすべて揃えています。インストールから Hello World の確認まで数分で完了し、そこからは自分のアイデアを do_xxxx として追加していくだけです。ぜひデータベース管理シェルや CI/CD の自動化スクリプト、あるいはチーム向けの運用ツールなどに活用してみてはいかがでしょうか。