[Python] argparseパッケージによるプログラムヘルプの作り方

Python

プログラムのヘルプを見たことはありますでしょうか。
-hや–helpオプションを指定して、プログラムの使い方を出力されるメッセージのことを指します。
自分で作成する必要があるのですが、プログラム本体ではないですし、あまり時間を割きたくないところだと思います。
Pythonではargparseパッケージによってプログラムヘルプを簡単に作成することができます。

argparseパッケージのAPIリファレンスはこちら

argparse --- Parser for command-line options, arguments and subcommands
ソースコード: Lib/argparse.py チュートリアル: このページは API のリファレンス情報が記載しています。 argparse チュートリアル では、コマンドラインの解析についてより優しく説明しています。 The argpa...

基本的な使い方

プログラムオプションとして、例えば、-vを指定することで、バージョン情報を出力させたい場合は、
以下のようにコーディングします。
ここではファイル名をargparse_test.pyとしています。

import argparse

def get_option():
    argparser = argparse.ArgumentParser('argparsev_test.py')
    argparser.add_argument('-v', '--version', action='version', version='argparsev_test.pyのバージョンは1.0です')
    args = argparser.parse_args()
    return args

if __name__ == '__main__':
    args = get_option()
    print('argparseパッケージテスト')

実行結果

実際にプログラムを実行すると以下の結果が出力されます。

$ python argparse_test.py
argparseパッケージテスト

今度はプログラム実行時に、-hまたは–helpオプションを追加して実行してみましょう。
以下の実行結果のように、プログラムヘルプを出力してくれます。
このプログラムヘルプでは、-vまたは–versionオプションを指定することで、
バージョン情報を出力できることを教えてくれます。

$ python argparse_test.py -h
usage: argparsev_test.py [-h] [-v]

options:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit

実際に-vまたは–versionをオプションに指定して実行すると、
-vオプションのヘルプメッセージ(add_argument関数で指定した文字列)を出力することができます。

$ python argparse_test.py -v
argparsev_test.pyのバージョンは1.0です

意図しないオプションを指定した場合は、以下のようなエラーが出力されます。

$ python argparse_test.py -a
usage: argparsev_test.py [-h] [-v]
argparsev_test: error: unrecognized arguments: -a

便利な使い方

argparseパッケージの便利な使い方を紹介します。

オプションによるフラグ設定

特定のオプションが指定されているかの確認に利用できます。
例えば、-Dオプションが指定されている場合に、特定の処理を実行させるなどが挙げられます。

add_argument関数でaction=’store_true’を指定することで、オプションフラグを設定できます。
参照時は、args.directoryといったオプション指定した文字列変数に、True or Falseがセットされます。

import argparse

def get_option():
    argparser = argparse.ArgumentParser('argparsev_test.py')
    argparser.add_argument('-v', '--version', action='version', version='argparsev_test.pyのバージョンは1.0です')
    argparser.add_argument('-D', '--directory', action='store_true', help='-Dオプションのヘルプメッセージ')
    args = argparser.parse_args()
    return args

if __name__ == '__main__':
    args = get_option()
    if args.directory == True:
        print('-Dオプション有効化')
    else:
        print('-Dオプション無効化')
    print('argparseパッケージテスト')

-Dオプションを追加した場合と追加しなかった場合で、以下ような実行結果になります。

$ python argparse_test.py
-Dオプション無効化
argparseパッケージテスト

$ python argparse_test.py -D
-Dオプション有効化
argparseパッケージテスト

データ型の指定

引数のデータ型を指定して、意図していないデータ型の場合にはエラーを発生させるといったことも可能です。
add_argument関数でtype=strまたはtype=intなどを指定することができます。
また、ユーザ関数を指定することもできますので、複雑な文字列パターンにも対応可能です。

import argparse
import datetime

def get_option():

    def check_datetime_format(string):
        (datestr, timestr) = string.split('T')
        (yyyy, mm, dd) = datestr.split('-')
        (hh24, mi, ss) = timestr.split(':')
        return datetime.datetime(int(yyyy), int(mm), int(dd), int(hh24), int(mi), int(ss))

    argparser = argparse.ArgumentParser('argparsev_test.py')
    argparser.add_argument('-v', '--version', action='version', version='argparsev_test.pyのバージョンは1.0です')
    argparser.add_argument('-s1', '--s1', type=int, help='-s1オプションのヘルプメッセージ')
    argparser.add_argument('-s2', '--s2', type=check_datetime_format, help='-s2オプションのヘルプメッセージ')
    args = argparser.parse_args()
    return args

if __name__ == '__main__':
    args = get_option()
    print('argparseパッケージテスト')

実行結果は以下の通りです。

$ python argparse_test.py -s1 99
argparseパッケージテスト ★s1に整数データを渡しているので正常終了

$ python argparse_test.py -s1 foo
usage: argparsev_test.py [-h] [-v] [-s1 S1] [-s2 S2]
argparsev_test.py: error: argument -s1/--s1: invalid int value: 'foo' ★s1に文字列データを渡しているのでエラー

$ python argparse_test.py -s2 2024-12-15T10:00:00
argparseパッケージテスト ★s2に意図したパターンの値を渡しているので正常終了

$ python argparse_test.py -s2 2024-12-15T10:00:00aaa ★s2に意図しないパターンの値を渡しているのでエラー
usage: argparsev_test.py [-h] [-v] [-s1 S1] [-s2 S2]
argparsev_test.py: error: argument -s2/--s2: invalid check_datetime_format value: '2024-12-15T10:00:00aaa'

まとめ

argparseパッケージを駆使することで、もっと細かい制御が可能です。
まずは基本的な使い方を抑えていただいて、プログラムヘルプを作ってみてください。

コメント

タイトルとURLをコピーしました