Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでコマンドラインインターフェース(CLI)を開発する方法 ― clickパッケージ活用ガイド

この記事では、Pythonを使ってコマンドラインインターフェース(CLI)を開発する方法を解説します。実際のコードに入る前に、まず「コマンドライン」とは何かを理解しておきましょう。

コマンドラインは、コンピュータープログラムの誕生以来使われてきた歴史ある仕組みで、コマンドをベースに構築されています。コマンドラインプログラムとは、シェルやコマンドラインから直接実行されるプログラムのことです。

コマンドラインインターフェース(CLI)は、マウス操作の代わりに、ターミナル・シェル・コンソール上でコマンドを入力して操作できるユーザーインターフェースを提供します。

CLIは実行ファイルから始まり、その設計に応じてスクリプトへさまざまなパラメーターを渡せます。主なパラメーターは次の3種類です。

  • 引数(Arguments): スクリプトに必ず渡す必要があるパラメーターです。指定しない場合、CLIはエラーを返します。たとえば pip install numpy の「numpy」が引数にあたります。
  • オプション(Options): 名前と値のペアで指定する任意のパラメーターです。たとえば pip install django --cache-dir ./my-cache-dir の場合、「--cache-dir」がオプションで、「./my-cache-dir」がキャッシュディレクトリとして使われる値です。
  • フラグ(Flags): 特定の動作の有効/無効を切り替えるための任意のパラメーターです。「--help」がその代表例です。

Pythonには「click」をはじめ、CLIを構築するためのパッケージが複数用意されています。clickを使えば、ごく少数のコード行でコマンドラインインターフェースを組み立てられます。

まずは、clickパッケージを使わないCLIプログラムの例を見てみましょう。clickを使うと「DRY(Don't Repeat Yourself)」の原則に従った実装がしやすくなるため、標準ライブラリだけで書いたCLIは、どうしても冗長になりがちです。

clickパッケージを使わないCLIプログラム

import sys
import random

def do_work():
    """ コマンドラインの処理を担当する関数 """
    args = sys.argv
    args = args[1:]  # 先頭要素はファイル名なので除外

    if len(args) == 0:
        print('You have not passed any commands in!')
    else:
        for a in args:
            if a == '--help':
                print('Basic command line program')
                print('Options:')
                print(' --help -> show this basic help menu.')
                print(' --monty -> show a Monty Python quote.')
                print(' --veg -> show a random vegetable')
            elif a == '--monty':
                print("He's not the Messiah—he's a very naughty boy")
            elif a == '--veg':
                print(random.choice(['Tomato', 'Radish', 'Carrot', 'Potato', 'Turnip']))
            else:
                print('Unrecognised argument.')

if __name__ == '__main__':
    do_work()

実行結果

c:\Python\Python361>python cli_interp1.py --monty
He's not the Messiah—he's a very naughty boy

c:\Python\Python361>python cli_interp1.py --help
Basic command line program
Options:
--help -> show this basic help menu.
--monty -> show a Monty Python quote.
--veg -> show a random vegetable

c:\Python\Python361>python cli_interp1.py --veg
Tomato

c:\Python\Python361>python cli_interp1.py --error
Unrecognised argument.

このように、sys.argv を直接扱う方式では、引数の解析をすべて自分で記述する必要があり、引数名の変更や新しいオプションの追加といった拡張に対する柔軟性に欠けます。

続いて、同じ機能をPythonのclickパッケージで実装した例を見てみましょう。

clickパッケージを使ったCLIプログラム

import click
import random

@click.command()
@click.option('--monty', default=False, help='Show a Monty Python quote.')
@click.option('--veg', default=False, help='Show a random vegetable.')
def do_work(monty, veg):
    """ 基本的なClickのサンプル """
    if monty:
        print("He's not the Messiah—he's a very naughty boy")
    if veg:
        print(random.choice(['Tomato', 'Radish', 'Carrot', 'Potato', 'Turnip']))

if __name__ == '__main__':
    do_work()

実行結果

c:\Python\Python361>python cli_interp2.py --help
Usage: cli_interp2.py [OPTIONS]

Basic Click example will follow your commands

Options:
--monty TEXT  Show a Monty Python quote.
--veg TEXT    Show a random vegetable.
--help        Show this message and exit.

このように、clickパッケージを使えばデコレーターを付けるだけでオプション定義やヘルプ表示を自動生成でき、CLIの作成が格段に簡単になります。面倒な引数解析のコードが不要になるため、プログラマーの負担を大幅に減らせる点も大きなメリットです。

  1. PythonのTkinterプログラミング入門:GUIアプリケーション開発の基本

    TkinterとはTkinterは、Pythonに標準で付属しているGUI(グラフィカルユーザーインターフェース)ライブラリです。PythonとTkinterを組み合わせることで、手軽かつスピーディーにGUIアプリケーションを構築できます。Tkinterは、Tk GUIツールキットへの強力なオブジェクト指向インターフェースを提供しており、ボタンやラベルなどの部品(ウィジェット)を直感的に配置できるのが特徴です。GUIアプリケーション作成の基本手順Tkinterを使ったGUIアプリケーションの作成はとてもシンプルです。基本的には、以下の手順に従うだけで実装できます。Tkinterモジュールをイン

  2. PythonのTurtleグラフィックス入門!基本メソッド一覧と図形描画サンプルコード集

    Turtle(タートル)はPythonに標準搭載された特殊な機能で、専用の描画ウィンドウ上に簡単に図形を描くことができるモジュールです。 使い方はとてもシンプルです。まずturtleモジュールをインポートし、次にウィンドウ(Screen)を作成、その後タートルオブジェクトを生成します。あとは各種メソッドを呼び出すだけで、キャンバス上に自由に描画できます。この記事では、よく使われるメソッドの一覧表と、正方形・星・六角形などの具体的な描画例をサンプルコード付きで解説します。 主なTurtleメソッド一覧 メソッド パラメータ 説明 Turtle() なし 新しいタートルオブジェクトを作成