Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
34
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@sesame

argparse

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))

argparseを使うには

パーサーを作る

argparseを使うには、まずArgumentParserオブジェクトを生成する。

parser = argparse.ArgumentParser(description='Process some integers.')

引数を追加する

add_argument()メソッドを呼び出し、ArgumentParserオブジェクトに
コマンドラインの文字列を受け取ってそれをオブジェクトにする方法を教える。

parser.add_argument('intgers', metavar='N', type=int, nargs='+',
  help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
  const=sum, default=max,
  help='sum the intgers (default: find the max)')

parse_args()を呼び出すと、integersとaccumulateという2つの属性を
持ったオブジェクトを返す。

integers属性は1つ以上の整数のリストで、accumulate属性は、
コマンドラインから--sumが指定された場合はsum()関数に、
それ以外の場合はmax()関数になる。

引数を解析する

ArgmumentParserは引数をparse_args()メソッドで解析する。
このメソッドは、コマンドラインを調べ、各引数を正しい型に変換して、
適切なアクションを実行する。

ほとんどの場合、これはコマンドラインの解析結果から、
シンプルなNamespaceオブジェクトを構築することを意味する。

スクリプト内では、parse_args()は通常引数無しで呼び出され、
ArgumentParserは自動的にsys.argvからコマンドライン引数を取得する。

ArgumentParserオブジェクト

class argparse.ArgumentParser(prog=None, usage=None, description=None,
 epilog=None, parents=[], formatter_class=argparse.helpFormatter,
 prefix_chars='-', fromfile_prefix_chars=None, argument_default=None,
 conflict_handler='error', add_help=true)

すべての引数は、キーワード引数として渡すべき。

引数 説明
prog プログラム名(デフォルト:sys.argv[0])
usage プログラムの利用方法を記述する文字列(デフォルト:パーサに追加された引数から生成される)
description 引数のヘルプの前に表示されるテキスト(デフォルト:none)
epilog 引数のヘルプの後で表示されるテキスト(デフォルト:none)
parents ArgumentParserオブジェクトのリストで、このオブジェクトの引数が追加される
formatter_class ヘルプ出力をカスタマイズするためのクラス
prefix_chars オプション引数のprefixになる文字集合(デフォルト:'-')
fromfile_prefix_chars 追加の引数を読み込むファイルのprefixになる文字集合(デフォルト:None)
argument_default 引数のグローバルなデフォルト値(デフォルト:None)
conflict_handler 衝突するオプションを解決する方法(通常は不要)
add_help -h/--helpオプションをパーサに追加する(デフォルト:True)

prog

argparseを使うと、ヘルプメッセージ上のプログラム名は、
デフォルトではsys.argv[0]から取得する。

myprogram.pyというプログラムを実行した場合、sys.argv[0]の値は
myprogram.pyになる。

プログラムがコマンドライン上の起動方法に合わせて
ヘルプメッセージを作成するため、ほとんどの場合望ましい挙動になる。

このデフォルトの動作を変更するには、ArgumentParserのprog=引数に
他の値を指定することで実現できる。

プログラム名は、sys.argv[0]から取られた場合でもprog=引数で与えられた
場合でも、ヘルプメッセージ中では%(prog)sフォーマット指定子で
利用できる。

>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo of the myprogram program

usage

usage: PROG [-h] [--foo [FOO]] bar [bar ...]

デフォルトでは、自動的にusageが作成されるが、
usage=キーワード引数で明示的に指定することができる。

parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
usage: PROG [options]

description

description=キーワード引数を使用すると、コマンドラインの利用法と引数の
ヘルプメッセージの間に、プログラムが何をしてどう動くのかに
ついての短い説明が表示される。

parser = argparse.ArgumentParser(description='A foo that bars')
parser.print_help()
usage: argparse.py [-h]

A foo that bars

optional arguments:
  -h, --help show this help message and exit

epilog

プログラムについての追加の説明を引数の説明の後に表示する。

>>> parser = argparse.ArgumentParser(
  description='A foo that bars',
  epilog="And that's how you'd foo a bar")
>>> parser.print_help()  
usage: argparse.py

A foo that bars

optional arguments:
  -h, --help  show this help message and exit

And that's how you'd foo a bar

parents

いくつかのパーサーに共通の引数セットを適用したい場合、
すべての共通引数を持ったパーサーをparents=引数に
渡すことができる。

一番親になるパーサーにadd_help=Falseを指定する。

parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('--parent', type=int)

foo_parser = argparse.ArgumentParser(parents=[parent_parser])
foo_parser.add_argument('foo')
foo_parser.parse_args(['--parent', '2', 'XXX'])

bar_parser = argparse.ArgumentParser(parents=[parent_parser])
bar_parser.add_argument('--bar')
bar_parser.parse_args(['--bar', 'YYY'])

add_argument()メソッド

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const]
  [, default][, type][, choices][, required][, help][, metavar][, dest])
引数 説明
name or flags 名前化、あるいはオプション文字列のリスト
action コマンドラインにこの引数があった時のアクション
nargs 消費すべきコマンドライン引数の数
const 一部のactionnargsの組み合わせで利用される定数
default コマンドラインに引数がなかった場合に生成される値
type コマンドライン引数が変換されるべき型
choices 引数として許される値のコンテナー
required コマンドラインオプションが省略可能かどうか
help 引数が何なのかを示す簡潔な説明
metavar 使用法メセージの中で使われる引数の名前
dest parse_args()が返すオブジェクトに追加される属性名

name or flags

指定されている引数が、-f--fooのようなオプション引数なのか、
ファイル名リストなどの位置引数なのかを、add_argument()の第1引数に
与える。

オプション引数は次のように作成する。

parser.add_argument('-f', '--foo')

位置引数は次のように作成する。

parser.add_argument('bar')

parse_args()が呼ばれた時、オプション引数は接頭辞-により
識別され、それ以外の引数は位置引数として扱われる。

action

store

単に引数の値を格納する。デフォルトのアクション。

store_const

constキーワード引数で指定された値を格納する。

parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_const', const=42)

fooという変数に、42が格納される。

store_true, store_false

それぞれTrueとFalseを格納する。

parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_false')

上記の場合fooTrueが、barFalseが格納される。

append

リストを格納して、各引数の値をそのリストに追加する。

このアクションは、複数回指定を許可したいオプションに便利。

parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
parser.parse_args('--foo 1 --foo 2'.splist())
Namespace(foo=['1', '2'])

append_const

リストを格納して、constキーワード引数に与えられた値を
そのリストに追加する。

parser = argparse.ArgumentParser()
parser.add_argument('--str', dest='types', action='append_const', const=str)
parser.add_argument('--int', dest='types', action='append_const', const=int)
parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])

count

キーワード引数の数を数える。

例えば、verboseレベルを上げるのに役立つ。

parser = argparse.ArgumentParser()
parser.add_argument('--versbose', '-v', action='count')
parser.parse_args('-vvv'.split())
Namespace(verbose=3)

nargs

通常、ArgumentParserオブジェクトは
1つのコマンドライン引数を1つのアクションに渡す。

nargsキーワード引数は、1つのアクションにそれ以外の数の
コマンドライン引数を割り当てることができる。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
  • N - nargsに整数を指定した場合、N個の引数がコマンドラインから集められ
    リストに格納される。

  • ? - 可能なら1つの引数がコマンドラインから取られ、1つのアイテムを作る。
    コマンドライン引数が存在しない場合、`default'の値が生成される。

  • '*' - 全てのコマンドライン引数がリストに集められる。

  • '+' - 全てのコマンドライン引数がリストに集められるが、最低でも
    1つのコマンドライン引数が存在しない場合にエラーメッセージを生成する。

type

デフォルトでは、ArgumentParserオブジェクトは、コマンドライン引数を
単なる文字列として読み込む。

コマンドラインの文字列を、float,intなど別の型として扱うべき場合、
add_argument()のtypeキーワード引数により型チェックと
型変換を行うことができる。

一般的なビルトインデータ型や関数をtype引数の値として直接指定できる。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int)
>>> parser.add_argument('bar', type=open)
>>> parser.parse_args('2 temp.text'.split())
Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)

choices

コマンドライン引数をいくつかの選択肢の中から選ばせたい場合、
choicesキーワード引数を渡すことで可能。

コマンドラインを解析する時に、引数の値がチェックされ、その値が
選択肢の中に含まれていない場合はエラーメッセージを表示する。

>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser = add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock', 'paper', 'scissors')

required

任意のオプション引数を必須にするには、required=キーワード引数にTrueを指定する。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: argparse.py [-h] [--foo FOO]
argparse.py: error: option --foo is required

help

ユーザがコマンドライン上で-h--helpを指定するなどして
ヘルプを要求した時、このhelpの説明が各引数に表示される。

>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', action='store_true',
      help='foo the bars before frobbling')
>>> parser.add_argument('bar', nargs='+',
      help='one of the bars to be frobbled')
>>> parser.parse_args('-h'.split())
usage: frobble [-h] [--foo] bar [bar ...]

positional arguments:
  bar  one of the bars to be frobbled

optional arguments:
  -h, --help   show this help message and exit
  --foo        foo the bars before frobbling

metavar

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo FOO] bar

positional arguments:
  bar

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO

デフォルトでは、位置引数にはdestの値をそのまま利用し、
オプション引数については、destの値を大文字に変換して利用する。

1つのdest='bar'である位置引数は、barとして参照される。
1つのオプション引数--fooが1つのコマンドライン引数を要求するときは、
その引数はFOOとして参照される。

代わりの名前を、metavarとして指定することができる。

>>> parser = argparse.ArgumnetParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo YYY] XXX

positional arguments:
  XXX

optional arguments:
  -h, --help show this help message and exit
  --foo YYY

nargsを指定した場合、metavarにタプルを渡すと
各引数に対して異なる名前を指定することができる。

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]

optional arguments:
  -h, --help    show this help message and exit
  -x X X
  --foo bar baz

dest

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')

ArgumentParserは、最初の長いオプション文字列を選択し、先頭の--
除去することで、destの値を生成する。

長いオプション文字列が指定されていない場合、最初の短いオプション文字列から
先頭の-文字を除去することでdestを生成する。

先頭以外のすべての-文字は、妥当な属性名になるように_へ変換される。

destにカスタムの属性名を与える場合は次のようにする。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
34
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
34
Help us understand the problem. What is going on with this article?