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

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

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: