Pythonでコマンドラインオプションの解析を行う(概要、コード例、値の確認)
バージョン2.3以上のPythonでは、optparseという強力なコマンドライン引数解析のモジュールが利用できる。
OptionParserというクラスを使用するのだが、オプションの処理(値の取得やオプション名のチェック)に加え、使用法のヘルプメッセージも作成してくれて、そのカスタマイズもできる。
下はこれを使用したコードの例。使用法に関してはコード中のコメントを参照。リファレンスも詳しい。
[任意]ファイル名: optparsetest.py
#! /usr/bin/python # -*- encoding: utf-8 -*- from optparse import OptionParser # ヘルプなどの設定 parser_config = { "usage" : u"%prog [オプション...] [入力ファイル]".encode("utf-8"), "version" : "%prog 0.1", } # オプションの既定値の設定 parser_defaults = { "nooutputfile" : False, "verbose" : True, "tries" : 1, } # 設定を読み込ませながら解析器を作成 parser = OptionParser(**parser_config) # 既定値をまとめて設定 parser.set_defaults(**parser_defaults) # 以下、各オプションの設定 # -fオプションを付けるとfilenameに後ろのファイル名が代入される parser.add_option("-f", "--file", # 短い形式と長い形式 dest="filename", # 格納される変数名 action="store", # 指定された値を代入 type="string", # 文字列 help=u"結果をFILEに書き出します".encode("utf-8"), # ヘルプ文字列 metavar="FILE") # ヘルプ表示上の値 # -nオプションを付けるとnooutputfile(既定値False)にTrueを代入 parser.add_option("-n", "--no-output-file", dest="nooutputfile", action="store_true", # 真偽値Trueを代入 help=u"結果をファイルに書き出しません".encode("utf-8")) # -qオプションを付けるとverbose(既定値True)にFalseを代入 parser.add_option("-q", "--quiet", dest="verbose", action="store_false", # 真偽値Falseを代入 help=u"端末への出力を行いません".encode("utf-8")) # -tオプションを付けるとtries(既定値1)に後ろの数値が代入される parser.add_option("-t", "--tries", dest="tries", action="store", type="int", # 整数 help=u"失敗したときにNUM回試行を繰り返します".encode("utf-8"), metavar="NUM") # 解析実行 (options, args) = parser.parse_args() # 同時に指定できないオプションのチェック例 if options.filename and options.nooutputfile == True: parser.error(u'"-f"オプションと"-n"オプションは同時に指定できません'.encode("utf-8")) # 値のチェック例: if options.tries < 1: parser.error(u"試行回数は1以上でなければなりません".encode("utf-8")) # 必要な引数がない場合のチェック例 if len(args) < 1: # 「len(args) != [要求する引数の数]」と書くと引数が多くてもNG parser.error(u"入力ファイルが指定されていません".encode("utf-8")) # 変数がどのようにセットされたかを見る print "options.filename : %s" % options.filename print "options.nooutputfile : %s" % options.nooutputfile print "options.verbose : %s" % options.verbose print "options.tries : %s" % options.tries print "args : %s" % args
(2008/6/9)これを書いたときに試したのはPython 2.5系だったのだが、2.4系で試したところ、Unicode文字列はencode()でエンコードしないとダメだったため、Unicode文字列部分を修正
下は、値がどのように代入されているのかを確かめるテスト。
(既定値が使用される例) $ ./optparsetest.py infile options.filename : None options.nooutputfile : False options.verbose : True options.tries : 1 args : ['infile'] (値をオプションから指定する例1) $ ./optparsetest.py -f test.log -q -t 10 infile options.filename : test.log options.nooutputfile : False options.verbose : False options.tries : 10 args : ['infile'] (値をオプションから指定する例2) $ ./optparsetest.py -n -t 5 infile1 infile2 options.filename : None options.nooutputfile : True options.verbose : True options.tries : 5 args : ['infile1', 'infile2']
エラーの処理やヘルプメッセージについては、スペースの関係で別記事で扱う。
関連記事:
参考URL: