Pythonで簡単にコマンドライン引数をパースする方法(optparse.OptionParser編)

2010年2月14日

Pythonで値付き引数(ex> --prefix "/hoge/path"など)を簡単に実現したいと思ったことは ありませんか?

そんなとき活躍するのがoptparseモジュールのOptionParserクラスです。

まずはともあれ、サンプルソースを見てみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
from optparse import OptionParser


def main():
    myusage = "%prog [-tf] [-a FILE] [-n INT] arg1 arg2"
    psr = OptionParser(usage=myusage)
    psr.add_option("-a", "--add", action="store", type="string", dest="filename", default="defaulthogehoge"
            , metavar="FILE", help="specify an input file")
    psr.add_option("-n", type="int", dest="num"
            , metavar="INT", help="specify number what you want")
    psr.add_option("-t", action="store_true", dest="bool_flag", default=False
            , help="just flag")
    psr.add_option("-f", action="store_false", dest="bool_flag", default=0
            , help="just flag")

    (opts, args) = psr.parse_args(sys.argv)
    print "args:\t%s" % args
    print "-a:\t%s" % opts.filename
    print "-b:\t%s" % opts.bool_flag
    # print "arg1:\t%s" % (sys.argv[1])
    # print "arg2:\t%s" % (sys.argv[2])
    print "\n\n===="
    psr.print_help()


if ( __name__ == "__main__" ):
    main()

上記のように、「from optparse import OptionParser」にてOptionParserクラスをインポートしておきます。 

その後、コンストラクタを呼び出して(psr = OptionParser(usage=myusage)の部分)、パーサーを作成しましょう。 

そのとき、引数にはコマンドラインヘルプの文字列を挿入することができます。


あとは、add-option()メソッドを使って、引数定義をします。 

最初の2つの引数が省略形オプション名、オプション名を指定する部分です。 

その後、引数の型を定義します。


この型には、値付き引数としたい場合は「action=store」、

引数のあり・なしで変数にtrue/falseのブール値を 指定できるようにしたいときは「action=store_true/store_false」と指定しましょう。 


それら指定した型の値が実際に挿入される変数をdest=...の右辺に指定します。


default」引数には、定義しようとしている引数が提示されなかった場合の格納先変数のデフォルト値を 指定します。


最後のhelp=...引数は、コマンドラインヘルプを出力したときの引数ヘルプ部分の説明文を 指定できます。

引数定義した後は、「parse-args(sys.argv)」にて実際に引数をパースしましょう。 

返り値として2つ組のタプル(opts, args)が返ってきます。 

optsのメンバ変数として、上記「dest=...」で定義した変数を参照することが出来ます。


もうひとつの返り値argsには、コマンドラインの値がリスト型として格納されていますので、 必要に応じて利用しましょう。

print_help()」メソッドにて、定義したコマンドラインヘルプを標準出力に表示することができます。

複雑なコマンドラインツールを作成するときは、非常に重宝しますのでぜひ使ってみてください。