# 6.19 `getopt` -- コマンドラインオプションのパーザ

このモジュールは`sys.argv`に入っているコマンドラインオプションの構文解 析を支援します。 ``-`' や ``-``-`' の特別扱いも含めて、 Unixの`getopt()`と同じ記法をサポートしています。 3番目の引数(省略可能)を設定することで、 GNUのソフトウェアでサポートされているような長形式のオプションも利用することが できます。 このモジュールは1つの関数と例外を提供しています:

`getopt`( | args, options[, long_options])

  コマンドラインオプションとパラメータのリストを構文解析します。 argsは構文解析の対象になる引数リストです。これは 先頭のプログラム名を除いたもので、通常"`sys.argv[1:]`"で与えられます。 options はスクリプトで認識させたいオプション文字と、引数が必要な場 合にはコロン("`:`")をつけます。つまりUnixの `getopt()`と同じフォーマットになります。

  注意: GNUの `getopt()`とは違って、オプションでない引数の後は全て オプションではないと判断されます。これは GNUでない、Unixシステムの挙 動に近いものです。

  long_optionsは長形式のオプションの名前を示す文字列のリストです。 名前には、先頭の`'-``-'`は含めません。引数が必要な場合 には名前の最後に等号("`=`")を入れます。長形式のオプションだけを 受けつけるためには、optionsは空文字列である必要があります。 長形式のオプションは、該当するオプションを一意に決定できる長さまで入力さ れていれば認識されます。たとえば、long_optionsが `['foo', 'frob']`の場合、--foは--foo に該当しますが、--f では一意に決定できないので、 `GetoptError`が発生します。

  返り値は2つの要素から成っています: 最初は `(option, value)`のタプルのリスト、2つ目はオプションリス トを取り除いたあとに残ったプログラムの引数リストです(argsの末尾部 分のスライスになります)。 それぞれの引数と値のタプルの最初の要素は、短形式の時はハイフン 1つで始まる文字列(例:`'-x'`)、長形式の時はハイフン2つで始まる文字 列(例: `'-``-long-option'`)となり、引数が2番目の要素になりま す。引数をとらない場合には空文字列が入ります。オプションは見つかった順 に並んでいて、複数回同じオプションを指定することができます。長形式と短 形式のオプションは混在させることができます。

`gnu_getopt`( | args, options[, long_options])

  この関数はデフォルトでGNUスタイルのスキャンモードを使う以外は `getopt()`と同じように動作します。つまり、オプションと オプションでない引数とを混在させることができます。`getopt()`関 数はオプションでない引数を見つけると解析をやめてしまいます。

  オプション文字列の最初の文字が '+'にするか、環境変数 POSIXLY_CORRECTを設定することで、 オプションでない引数を見つけると解析をやめるように振舞いを変えることがで きます。

exception `GetoptError`

  引数リストの中に認識できないオプションがあった場合か、引数が必要なオプショ ンに引数が与えられなかった場合に発生します。例外の引数は原因を示す文字 列です。長形式のオプションについては、不要な引数が与えられた場合にもこ の例外が発生します。`msg`属性と`opt`属性で、エラーメッセー ジと関連するオプションを取得できます。特に関係するオプションが無い場合 には`opt`は空文字列となります。

  バージョン1.6 以降で変更された 仕様: `GetoptError` は `error`の別名として導入されました。

exception `error`
  `GetoptError`へのエイリアスです。後方互換性のために残されてい ます。

Unixスタイルのオプションを使った例です:

    >>> import getopt
    >>> args = '-a -b -cfoo -d bar a1 a2'.split()
    >>> args
    ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
    >>> optlist, args = getopt.getopt(args, 'abc:d:')
    >>> optlist
    [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
    >>> args
    ['a1', 'a2']

長形式のオプションを使っても同様です:

    >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
    >>> args = s.split()
    >>> args
    ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
    >>> optlist, args = getopt.getopt(args, 'x', [
    ...     'condition=', 'output-file=', 'testing'])
    >>> optlist
    [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x',
     '')]
    >>> args
    ['a1', 'a2']

スクリプト中での典型的な使い方は以下のようになります:

    import getopt, sys

    def main():
        try:
            opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
        except getopt.GetoptError:
            # ヘルプメッセージを出力して終了
            usage()
            sys.exit(2)
        output = None
        verbose = False
        for o, a in opts:
            if o == "-v":
                verbose = True
            if o in ("-h", "--help"):
                usage()
                sys.exit()
            if o in ("-o", "--output"):
                output = a
        # ...

    if __name__ == "__main__":
        main()