Search on the blog

2016年4月26日火曜日

便利なPythonライブラリ(4)OptionParser

 コマンドライン引数を解析するときはOptionParserが便利。

(2016/4/29追記) zfhrp7さんがコメントにてご指摘くださったように、OptionParserはpending deprecationとなっています。同様の機能を提供するargparseを使うようにしてください。

サンプル
from optparse import OptionParser

def main():
    parser = OptionParser()
    parser.add_option("-n", "--n_jobs", dest="n_jobs",
                      action="store", type="int", default=1,
                      metavar="N", help="run N jobs in parallel")
    parser.add_option("-v", "--verbose", dest="verbose",
                      action="store_true", default=False,
                      help="if true, output verbose messsages")
    (options, args) = parser.parse_args()
    print (options)
    print (args)

if __name__ == '__main__':
    main()

説明

上のサンプルのように、オプションと次の値のセットで指定するコマンド引数も、オプション単体で指定するコマンド引数も、正しく解析することができる。

add_optionの引数の説明を下表にまとめる。
引数 説明
第一引数 コマンドラインから渡されるオプション名 
第二引数 コマンドラインから渡されるオプション名(第一引数とは別の表記)
dest 解析後に、optionsのどのキーに設定するか
action オプションが与えられたとき何をするか
次の引数を設定値として格納する、フラグをtrueにする、フラグをfalseにするなど
type オプションの次の引数が満たすべき型
default オプションが指定されなかったときのデフォルト値
metavar ヘルプの文言中に使うメタ値
help ヘルプに表示する文言

実行結果

実行サンプルをいくつか。

まず、ヘルプの表示。
kenjih$ python main.py -h
Usage: main.py [options]

Options:
  -h, --help        show this help message and exit
  -n N, --n_jobs=N  run N jobs in parallel
  -v, --verbose     if true, output verbose messsages

次にオプションを指定した場合。parserに解析されなかったコマンド引数はargsに格納されることに注意。
kenjih$ python main.py -n 5 -v arg1 arg2
{'n_jobs': 5, 'verbose': True}
['arg1', 'arg2']

最後にオプション指定なしの場合。
kenjih$ python main.py 
{'n_jobs': 1, 'verbose': False}
[]

2 件のコメント:

  1. 一応念のためですが、optparseは廃止日未定ながらpending deprecaitonでargparseを使ってくださいということになっています (PEP389)

    その他ではClick,docopt(,argparse)が紹介されていました
    https://realpython.com/blog/python/comparing-python-command-line-parsing-libraries-argparse-docopt-click/

    返信削除
    返信
    1. zfhrp7さん、コメントありがとうございます。
      pending deprecationになっていたのですね。本文に注釈を追記しておきます。

      削除