Pythonのコマンドライン引数の説明の表示を追加する(argparse編)

Pythonのargparseモジュールでコマンドライン引数を読み取るスクリプトの、ヘルプで表示されるコメントを増やしてみました。

目次

  1. argparseモジュールとは
  2. スクリプトのヘルプの表示
  3. ヘルプの設定例

argparseモジュールとは

argparseモジュールは、Pythonのスクリプトのコマンドライン引数を設定する便利モジュールです。使い方は 以前の投稿 を参照してください。

スクリプトのヘルプの表示

argparseモジュールを使うと、-hまたは--helpをコマンドラインに指定することでそのスクリプトのヘルプが表示されます。

このヘルプの表示にいろいろ追加してみます。

まず、パーサーオブジェクトを作るArgumentParserオブジェクトのコンストラクター引数にいろいろと指定できます。

parser = argparse.ArgumentParser([prog], [usage], [description], [epilog], [parents], [formatter_class], [prefix_chars], [fromfile_prefix_chars], [argument_default], [conflict_handler], [add_help], [allow_abbrev])
変数 内容
prog str 省略可。既定値はNone。ヘルプに表示するプログラム名。Noneのときはsys.argv[0]。
usage str 省略可。既定値はNone。ヘルプに表示する使用方法。
description str 省略可。既定値はNone。ヘルプに表示するスクリプトの動作内容の説明。
epilog str 省略可。既定値はNone。ヘルプの引数の説明の後に表示される説明。
parents list 省略可。既定値は空のリスト。他のパーサーとの共通の引数の情報。
formatter_class argparse 省略可。既定値はargparse.HelpFormatter。ヘルプのフォーマット。
prefix_chars str 省略可。既定値は'-'。オプショナル引数の接頭辞。
fromfile_prefix_chars str 省略可。既定値はNone。引数を外部ファイルに保存して利用するときの、ファイルの指定文字。
argument_default list 省略可。既定値はNone。パーサー全体に適用する引数の既定値。
conflict_handler str 省略可。既定値は'error'。同じ引数名を使って引数を作ろうとしたときの動作の指定。
add_help bool 省略可。既定値はTrue。ヘルプを追加するかどうか。
allow_abbrev bool 省略可。既定値はTrue。長い引き数名を短縮して入力できるようにするかどうか。
parser ArgumentParser パーサーオブジェクト。

ヘルプを設定する項目がいろいろありますね。

パーサーオブジェクトに引数を登録するときに使うadd_argumentメソッドにも、ヘルプを設定する項目があります。

ArgumentParser.add_argument(name, [action], [nargs], [const], [default], [type], [choices], [required], [help], [metavar], [dest])
変数 内容
name str,list 引数の名前、またはそのリスト。
action str 省略可。既定値はstore。引数が存在したときのアクション。
nargs int,str 省略可。受け取るべき引数の数。
const   省略可。既定値はNone。actionとnargsに利用される定数。
default   省略可。既定値はNone。引数が指定されなかったときの既定値。
type   省略可。引数を変換する型。
choices   省略可。引数として許容できる範囲。
required bool 省略可。既定値はFalse。引数を省略可能かどうか。
help str 省略可。引数の説明。
metavar str 省略可。既定値は、位置引数の場合は名前。オプショナル引数の場合は名前を大文字に変換したもの。ヘルプで表示される引数の名前。
dest str 省略可。既定値はnameから接頭辞を削除したもの。パースしたときのプロパティ名。

ArgumentParserコンストラクターのprog、usage、description、epilogとadd_argumentメソッドのhelpに、ヘルプに追加する文言を指定すればよさそうです。

ヘルプの設定例

試してみましょう。まず素の状態です。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--hoge')
parser.add_argument('--piyo')
parser.add_argument('fuwa')
parser.add_argument('saku')
args = parser.parse_args()
print('引数 hoge : ', args.hoge)
print('引数 piyo : ', args.piyo)
print('引数 fuwa : ', args.fuwa)
print('引数 saku : ', args.saku)
>python argtry.py
usage: argtry.py [-h] [--hoge HOGE] [--piyo PIYO] fuwa saku
argtry.py: error: the following arguments are required: fuwa, saku

>python argtry.py --help
usage: argtry.py [-h] [--hoge HOGE] [--piyo PIYO] fuwa saku

positional arguments:
  fuwa
  saku

optional arguments:
  -h, --help   show this help message and exit
  --hoge HOGE
  --piyo PIYO

スクリプト名と引数名から何を入力すれば良いかわかるのであれば、このままでも良さそうです。

では、いろいろ指定してみます。

まず、ArgmentParserコンストラクターの引数を指定してみましょう。

import argparse

parser = argparse.ArgumentParser(prog='PROG', usage='USAGE', description='DESCRIPTION', epilog='EPILOG')
parser.add_argument('--hoge')
parser.add_argument('--piyo')
parser.add_argument('fuwa')
parser.add_argument('saku')
args = parser.parse_args()
print('引数 hoge : ', args.hoge)
print('引数 piyo : ', args.piyo)
print('引数 fuwa : ', args.fuwa)
print('引数 saku : ', args.saku)
>python argtry.py
usage: USAGE
PROG: error: the following arguments are required: fuwa, saku

>python argtry.py --help
usage: USAGE

DESCRIPTION

positional arguments:
  fuwa
  saku

optional arguments:
  -h, --help   show this help message and exit
  --hoge HOGE
  --piyo PIYO

EPILOG

usageを指定することで、コマンドライン引数の使い方の説明が上書きされてしまいました。これは善し悪しですね。

usageを指定しないとこういう出力になります。

>python argtry.py
usage: PROG [-h] [--hoge HOGE] [--piyo PIYO] fuwa saku
PROG: error: the following arguments are required: fuwa, saku

>python argtry.py --help
usage: PROG [-h] [--hoge HOGE] [--piyo PIYO] fuwa saku

DESCRIPTION

positional arguments:
  fuwa
  saku

optional arguments:
  -h, --help   show this help message and exit
  --hoge HOGE
  --piyo PIYO

EPILOG

usageのところのスクリプト名がPROGに置き換わり、usageと引数の説明の間にDESCRIPTIONが入り、引数の説明に続けてEPILOGが書かれています。それぞれ、用途に合わせて説明用の文字列を設定すれば良いのですね。

では、add_argumentメソッドにいろいろ指定してみます。

import argparse

parser = argparse.ArgumentParser(prog='PROG', description='DESCRIPTION', epilog='EPILOG')
parser.add_argument('--hoge', help='ほげ')
parser.add_argument('--piyo', metavar='ぴよ')
parser.add_argument('fuwa', help='ふわ')
parser.add_argument('saku', metavar='さく')
args = parser.parse_args()
print('引数 hoge : ', args.hoge)
print('引数 piyo : ', args.piyo)
print('引数 fuwa : ', args.fuwa)
print('引数 saku : ', args.saku)
>python argtry.py
usage: PROG [-h] [--hoge HOGE] [--piyo ぴよ] fuwa さく
PROG: error: the following arguments are required: fuwa, さく

>python argtry.py --help
usage: PROG [-h] [--hoge HOGE] [--piyo ぴよ] fuwa さく

DESCRIPTION

positional arguments:
  fuwa         ふわ
  さく

optional arguments:
  -h, --help   show this help message and exit
  --hoge HOGE  ほげ
  --piyo ぴよ

EPILOG

helpに指定した文字列がそれぞれ引数の右側に表示されています。簡潔な説明をここに書けばOKですね。

metavar引数を指定すると表示名が変わるのですが、オプショナル引数のほうは良いとして、位置引数のほうはusageの方までsakuという引数名が「さく」に置き換わってしまっています。これはちょっとまずいですね。位置引数にmetavarを設定するときは要注意です。

広告

Pythonのコマンドライン引数カテゴリの投稿