試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Pythonでコマンドラインオプションの解析を行う(エラー処理、ヘルプメッセージ)

Pythonでコマンドラインオプションの解析を行う(概要、コード例、値の確認)」の続き。
この記事で解説しているのは、その記事内のコードについてとなっている。

ヘルプ(オプション一覧)とバージョン情報の表示

OptionParserオブジェクトのメンバ関数add_option()で登録したオプションに対して、自動的にヘルプのオプション一覧が生成される。また、同オブジェクトのコンストラクタへのキーワード引数*1の指定*2により、使用法(Usage)で表示する書式を変更することができ、それに加えて、--versionオプション指定時に表示されるバージョン情報の設定もできる。

$ ./optparsetest.py -h
Usage: optparsetest.py [オプション...] [入力ファイル]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  結果をFILEに書き出します
  -n, --no-output-file  結果をファイルに書き出しません
  -q, --quiet           端末への出力を行いません
  -t NUM, --tries=NUM   失敗したときにNUM回試行を繰り返します

$ ./optparsetest.py --version
optparsetest.py 0.1

エラーの自動処理

OptionParserは、登録したオプションに対して不正とみられるオプション指定があったときにエラーを表示し、終了する。プロセスの戻り値は2。

存在しない(登録していない)オプションを指定した場合

受け付けないオプション指定があるとエラーを表示する。

$ ./optparsetest.py -a
Usage: optparsetest.py [オプション...] [入力ファイル]

optparsetest.py: error: no such option: -a

$ echo $?
2
値を要求するオプションに対して値を指定しなかった場合

後ろに値を要求し、変数に代入するタイプのものでは、値の部分が抜けたときにエラーを表示する。

$ ./optparsetest.py -f
Usage: optparsetest.py [オプション...] [入力ファイル]

optparsetest.py: error: -f option requires an argument
オプションに対する値の型が不正な場合

int型の数値を要求するところに文字列が入ったりすると、エラーを表示する。

$ ./optparsetest.py -t test
Usage: optparsetest.py [オプション...] [入力ファイル]

optparsetest.py: error: option -t: invalid integer value: 'test'

自動処理されないエラーを自分でチェックする

引数の数や矛盾したオプションなどは、その性質上、自動的には処理されない。コードを書く人が、どのような指定が不適切かを判断してOptionParserオブジェクトのメンバ関数error()を呼ぶことにより、チェックに引っかかったときのエラー処理を行うようにする。

引数のチェック

parse_args()が返すデータの内、2番目に入っているものが、オプションを除いた引数となる。これに対してlen()関数を使用することで引数の数が確認できる。これを使用して、プログラム側で要求する数と比較する形でチェックすることになる。
下は、必要な引数が指定されなかったときにエラーを出す例。

(正常な指定の例)
$ ./optparsetest.py -f out.dat infile
options.filename     : out.dat
options.nooutputfile : False
options.verbose      : True
options.tries        : 1
args                 : ['infile']

(必要な引数が足りない例)
$ ./optparsetest.py 
Usage: optparsetest.py [オプション...] [入力ファイル]

optparsetest.py: error: 入力ファイルが指定されていません
同時に指定できないオプション

オプションの意味によっては、指定が同時に成り立たない(矛盾する)場合が起こりうる。その場合、それぞれのオプションから代入される変数の値を見て、両方指定されている場合にエラーになるようにする。
そのようなチェックを行うコードを書くと、下のようにエラーを出すことができる。

$ ./optparsetest.py -f out.dat -n
Usage: optparsetest.py [オプション...] [入力ファイル]

optparsetest.py: error: "-f"オプションと"-n"オプションは同時に指定できません      

関連記事:

参考URL:

*1:「名前=値」の形式をとる引数

*2:今回のコード中では辞書を使用して「parser = OptionParser(**parser_config)」という形で指定している