home changes contents help options

207:コマンドラインオプションを得る

optparse モジュールによるコマンドラインオプションの解析

使用例

まず optparse モジュールを用いて引数ありオプション --user, --password と 引数なしオプション --comment をもつプログラムを作成した例を提示します。

スクリプト smailvideo_downloader.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import optparse
usage = u'%prog [-c] [-u MAIL_ADDRESS] [-p PASSWORD] sm??????'
version = u'%prog 0.0'
parser = optparse.OptionParser(usage=usage, version=version)
parser.add_option(
        '-u', '--user',
        action='store',
        type='string',
        help=u'ログインユーザー名(メールアドレス)',
        metavar='MAIL_ADDRESS',
        )
parser.add_option(
        '-p', '--password',
        action='store',
        type='string',
        help=u'ログインユーザー名に対応するパスワード',
        )
parser.add_option(
        '-c', '--comment',
        action='store_true',
        help=u'コメント XML を取得する',
        )
parser.set_defaults(
        user='xxxxxxxx@xxx.jp',
        password='',
        comment=False,
        )

options, args = parser.parse_args()

print args
print options
実行例1 ヘルプ表示
$ python smailvideo_downloader.py -h
Usage: smailvideo_downloader.py [-c] [-u MAIL_ADDRESS] [-p PASSWORD] sm??????

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -u MAIL_ADDRESS, --user=MAIL_ADDRESS
                        ログインユーザー名(メールアドレス)
  -p PASSWORD, --password=PASSWORD
                        ログインユーザー名に対応するパスワード
  -c, --comment         コメント XML を取得する

実行例2 バージョン表示
$ python smailvideo_downloader.py --version
smailvideo_downloader.py 0.0

実行例3 通常実行
$ python smailvideo_downloader.py sm000000
['sm000000']
{'comment': False, 'password': u'', 'user': u'xxxxxxxx@xxx.jp'}

$ python smailvideo_downloader.py --comment --user foo --password bar sm000000
['sm000000']
{'comment': True, 'password': 'bar', 'user': 'foo'}

optparse 使い始め

はじめに

optparse モジュールは拡張性を担保するため複雑なつくりになっています。 そのため以下の解説では意図的に省いている機能・使用方法が 多数あることを初めに断っておきます。

詳細はリファレンスマニュアルを参照してください。 optparse モジュールの提供する各クラスの拡張に挑戦したい人は optparse.py ソースコードを参照してください。

パーサーの作成

まずはパーサーを作成します。パーサーを作成するには optparse.OptionParser?() を呼びます。

parser = optparse.OptionParser()

パーサーは -h, --help に対応する 1 つのオプションのみを持った状態で作成されます。

オプションの追加

--help オプションだけでは意味をなさないのでオプションを追加しましょう。 パーサーの add_option メソッドを使います。-u もしくは --user に対応するオプションを追加するには以下のようにします。

parser.add_option('-u', '--user')

対応する名前はいくつも指定できますが、短い名前と長い名前1つずつのセットというものがよく見かけられるパターンです。

これで引数を 1 つとるオプション -u, --user が追加されました。 別のオプションを追加するには add_option を引数を変えて再度実行します。

解析の実行

パーサー の parse_args() メソッドを呼び出すと、パーサーは sys.argv[1:]? の解析をはじめます。 そして見つかったオプションを束ねた Values クラスインスタンスと引数のリストを返します。

options, args = parser.parse_args()

args は sys.argv[1:]? からオプションに関連するものを取り除いたリストになります。

オプションがオプション引数をとる場合、その値は options の属性に格納されます。 属性名はデフォルトでは最初に追加された長い名前と同じです。 つまり、先ほど追加した -u, --user オプションの引数の値は options.user でアクセスできます。 --user オプションが実行されなかった場合、 options.user に格納されている値は、 None です。

まずは以下のプログラム parser1.py をコマンドラインで実行し、感触をつかんでみてください。

parser1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import optparse
parser = optparse.OptionParser()
parser.add_option('-u', '--user')
options, args = parser.parse_args()

print args
print options.user
実行例
$ parser1.py --help
Usage: parser1.py [options]

Options:
  -h, --help   show this help message and exit
  -u USER, --user=USER

$ parser1.py foo bar baz
['foo', 'bar', 'baz']
None

$ parser1.py --user foo bar baz
['bar', 'baz']
foo

プログラムの引数の数のチェック

引数がある一定の個数のときのみ実行し、そうでないときにはエラーメッセージと使用方法を出力して終了してみます。 解析後の引数リストからはオプションは取り除かれているため、これの長さすなわち引数の数となります。 エラーメッセージと使用方法を出力して終了するにはパーサーの error メソッドを使います。 parser1.py を引数を 1 つのみ受け付けるように修正すると次のようになります。

parser2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import optparse
parser = optparse.OptionParser()
parser.add_option('-u', '--user')
options, args = parser.parse_args()

if len(args) < 1:
    parser.error(u'引数をひとつ入力してください')
elif len(args) > 1:
    parser.error(u'引数が多すぎます')

print args
print options.user
実行例
$ parser2.py foo
['foo']
None

$ parser2.py foo bar
Usage: parser2.py [options]

parser2.py: error: 引数が多すぎます'

この実行例から error メソッドが呼び出されると、後にある print 文は実行されないことがわかります。

オプション解析結果の初期値

--user オプションが指定されていないときの options.user の値は None でした。 これは変更することができます。パーサーの set_defaults メソッドを用います。 parser1.py の user オプション変数の初期値を文字列 'anonymous' に設定するには次のようにします。

parser = optparse.OptionParser()
parser.add_option('-u', '--user')
parser.set_defaults(user='anonymous')
options, args = parser.parse_args()

さまざまなオプション

ここまでで文字列引数を1つとるオプションの作り方について説明しました。 次からは引数をとらないオプション、文字列型以外の引数をとるオプションについて説明をします。

オプションを追加する際に用いる add_option メソッドにはオプションの種類を決定する重要な引数 action があります。 これを指定することにより普段見かけるタイプのオプションを手軽に作成することができるようになっています。

引数をとらないオプション

action 引数に 'store_true' 、 'store_false' を指定することにより作成できます。 オプションが設定されると 'store_true' は True を、 'store_false' は False をオプションの属性に格納します。 次の例では options.verbose に True を格納する -v, --verbose オプションを作成します。

parser = optparse.OptionParser()
parser.add_option(
        '-v', '--verbose',
        action='store_true', 
        )
options, args = parser.parse_args()

引数をとるオプション

引数を1つとるオプションを作成するには action 引数に 'store' を指定します。'store' の指定は省略可能です。 引数の型は type 引数で指定します。型は 'string', 'int', 'long', 'float', 'complex'で指定します。 'string' は省略可能です。

次の例は最初に出てきた parser.add_option('-u', '--user') と同じです。引数1つを文字列として options.user に格納するオプション -u, --user を作成します。

parser = optparse.OptionParser()
parser.add_option(
        '-u', '--user',
        action='store',
        type='string',
        )
options, args = parser.parse_args()

次の例は引数1つを浮動点小数に変換して options.quality に格納するオプション -q, --quality を作成します。 変換に失敗すると OptionValueError? が送出されます。

parser = optparse.OptionParser()
parser.add_option(
        '-q', '--quality',
        action='store',
        type='float',
        )
options, args = parser.parse_args()

ヘルプの作成

特に設定をしなくとも '-h', '--help' オプションにて使用方法、オプションの説明を表示できる、 というところまでは説明しました。しかし、

Usage: smailvideo_downloader.py [options]

Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER
  -p PASSWORD, --password=PASSWORD
  -c, --comment

という出力からはこのプログラムがどのような引数をいくつとり、 オプションが何を意味するのかを読み取ってもらうのは困難です。 作成しているプログラムが自分用の使い捨てスクリプトでない限り、これらを表示できるようにしておくことを勧めます。

使用方法の説明

使用方法の説明をカスタマイズするにはパーサーの作成時、 OptionParser? の usage 引数に説明文を与えます。 この説明文内に %prog を含めると実行時にスクリプトファイル名に置き換えて表示してくれます。

usage = u'%prog [-c] [-u USER] [-p PASSWORD] sm??????'
parser = optparse.OptionParser(usage=usage)
表示例
Usage: smailvideo_downloader.py [-c] [-u USER] [-p PASSWORD] sm??????

Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER
  -p PASSWORD, --password=PASSWORD
  -c, --comment

オプションの説明

オプションに説明を加えるにはオプション作成時に呼ぶ add_option メソッドの help 引数に説明文を与えます。

parser.add_option(
        '-u', '--user',
        action='store',
        type='string',
        help=u'ログインユーザー名(メールアドレス)',
        )
表示例
Usage: smailvideo_downloader.py [-c] [-u USER] [-p PASSWORD] sm??????

Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER  ログインユーザー名(メールアドレス)
  -p PASSWORD, --password=PASSWORD
                        ログインユーザー名に対応するパスワード
  -c, --comment         コメント XML を取得する

オプション引数の表示を変更するにはオプション作成時に呼ぶ add_option メソッドの metavar 引数に文字列を与えます。 「-u USER, --user=USER ログインユーザー名(メールアドレス)」のオプション表示を 「-u MAIL_ADDRESS, --user=MAIL_ADDRESS ログインユーザー名(メールアドレス)」に変更してみます。

parser.add_option(
        '-u', '--user',
        action='store',
        type='string',
        help=u'ログインユーザー名(メールアドレス)',
        metavar='MAIL_ADDRESS',
        )
表示例
Usage: smailvideo_downloader.py [-c] [-u USER] [-p PASSWORD] sm??????

Options:
  -h, --help            show this help message and exit
  -u MAIL_ADDRESS, --user=MAIL_ADDRESS
                        ログインユーザー名(メールアドレス)
  -p PASSWORD, --password=PASSWORD
                        ログインユーザー名に対応するパスワード
  -c, --comment         コメント XML を取得する

バージョン表示の作成

optparse ではアプリバージョンの表示を行えるようにするための簡単な方法が用意されています。 パーサーの作成時、 OptionParser? の version 引数に説明文を与えます。 するとパーサーに --version オプションが追加されます。 この説明文に %prog を含めておくと実行時にスクリプト名に変換されます。

version = u'%prog 0.0'
parser = optparse.OptionParser(version=version)
表示例
smailvideo_downloader.py 0.0

ヘルプ表示例
Usage: smailvideo_downloader.py [-c] [-u USER] [-p PASSWORD] sm??????

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -u MAIL_ADDRESS, --user=MAIL_ADDRESS
                        ログインユーザー名(メールアドレス)
  -p PASSWORD, --password=PASSWORD
                        ログインユーザー名に対応するパスワード
  -c, --comment         コメント XML を取得する