argparse --- コマンドラインオプションや引数、サブコマンド向けのパーサー¶
Added in version 3.2.
ソースコード: Lib/argparse.py
注釈
While argparse is the default recommended standard library module
for implementing basic command line applications, authors with more
exacting requirements for exactly how their command line applications
behave may find it doesn't provide the necessary level of control.
Refer to 引数解析ライブラリの選択 for alternatives to
consider when argparse doesn't support behaviors that the application
requires (such as entirely disabling support for interspersed options and
positional arguments, or accepting option parameter values that start
with - even when they correspond to another defined option).
argparse モジュールを使うと、使いやすいコマンドラインインターフェースを簡単に作成できます。
プログラムで必要な引数を定義すると、argparse が sys.argv からそれらを解析する方法を判断します。
argparse はヘルプと使用法のメッセージも自動生成し、ユーザーが不正な引数を渡すとエラーを表示します。
argparse のコマンドラインインターフェースのサポートは、argparse.ArgumentParser のインスタンスを中心に構成されています。
このオブジェクトは引数の仕様を格納し、パーサー全体に適用するオプションを持ちます。
parser = argparse.ArgumentParser(
prog='ProgramName',
description='What the program does',
epilog='Text at the bottom of help')
ArgumentParser.add_argument() メソッドは各引数の仕様をパーサーに付属させます。このメソッドは位置引数、値を受け取るオプション、機能のオン/オフを切り替えるフラグをサポートします:
parser.add_argument('filename') # 位置引数
parser.add_argument('-c', '--count') # 値を取るオプション
parser.add_argument('-v', '--verbose',
action='store_true') # オン/オフフラグ
ArgumentParser.parse_args() メソッドはパーサーを実行し、抽出したデータを argparse.Namespace オブジェクト内に配置します:
args = parser.parse_args()
print(args.filename, args.count, args.verbose)
注釈
optparse のコードを argparse に移行する方法は、Optparse のコードのアップグレード を参照してください。
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, allow_abbrev=True, exit_on_error=True)¶
新しい
ArgumentParserオブジェクトを生成します。すべての引数はキーワード引数として渡すべきです。各引数についてはあとで詳しく説明しますが、簡単に言うと:prog - The name of the program (default:
os.path.basename(sys.argv[0]))usage - プログラムの利用方法を記述する文字列 (デフォルト: パーサーに追加された引数から生成されます)
description - 引数のヘルプの前に表示されるテキスト (デフォルトはテキストなしです)
epilog - 引数のヘルプの後に表示されるテキスト (デフォルトはテキストなしです)
parents -
ArgumentParserオブジェクトのリストで、このオブジェクトの引数が追加されますformatter_class - ヘルプ出力をカスタマイズするためのクラス
prefix_chars - オプションの引数の prefix になる文字集合 (デフォルト: '-')
fromfile_prefix_chars - 追加の引数を読み込むファイルの prefix になる文字集合 (デフォルト:
None)argument_default - 引数のグローバルなデフォルト値 (デフォルト:
None)conflict_handler - 衝突するオプションを解決する方法 (通常は不要)
add_help -
-h/--helpオプションをパーサーに追加する (デフォルト:True)allow_abbrev - Allows long options to be abbreviated if the abbreviation is unambiguous. (default:
True)exit_on_error - エラーが起きたときに、
ArgumentParserがエラー情報を表示して終了するかどうか (デフォルト:True)
バージョン 3.5 で変更: allow_abbrev 引数が追加されました。
バージョン 3.8 で変更: 以前のバージョンでは、 allow_abbrev は、
-vvが-v -vと等価になるような、短いフラグのグループ化を無効にしていました。バージョン 3.9 で変更: exit_on_error 引数が追加されました。
以下の節では各オプションの利用方法を説明します。
prog¶
デフォルトでは、ArgumentParser は Python インタープリタの実行方法に応じて、ヘルプに表示するプログラム名を求めます。
ファイルを引数に渡した場合は、
sys.argv[0]のベース名。ディレクトリか ZIP ファイルを引数に渡した場合は、Python インタープリタの名前に
sys.argv[0]を続けたもの。-mオプションを使った場合は、Python インタープリタの名前に-m、モジュール名またはパッケージ名を続けたもの。
このデフォルトの動作では、コマンドラインでプログラムを実行した文字列とヘルプの表記が一致するので、ほとんどの場合に適しています。
変更したい場合は、ArgumentParser の prog= 引数に別の値を指定できます。
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]
options:
-h, --help show this help message and exit
Note that the program name, whether determined from sys.argv[0] or from the
prog= argument, is available to help messages using the %(prog)s format
specifier.
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
options:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
usage¶
デフォルトでは、ArgumentParser は登録された引数から使用法のメッセージを生成します。
usage= キーワード引数を指定すると、このメッセージを置き換えられます。
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]
positional arguments:
bar bar help
options:
-h, --help show this help message and exit
--foo [FOO] foo help
%(prog)s フォーマット指定子を、使用法メッセージ内でプログラム名として利用できます。
description¶
ArgumentParser コンストラクターを呼ぶ際は、多くの場合 description= キーワード引数を使います。
この引数には、プログラムが何をどのように行うかの簡潔な説明を指定します。
ヘルプでは、コマンドラインの使用法を示す文字列と各引数のヘルプの間に表示されます。
デフォルトでは、説明は与えられたスペースに合わせて折り返されます。この挙動を変更するには、formatter_class 引数を参照してください。
epilog¶
いくつかのプログラムは、プログラムについての追加の説明を引数の説明の後に表示します。このテキストは ArgumentParser の 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 [-h]
A foo that bars
options:
-h, --help show this help message and exit
And that's how you'd foo a bar
description 引数と同じく、epilog= テキストもデフォルトで折り返され、ArgumentParser の formatter_class 引数で動作を調整できます。
parents¶
ときどき、いくつかのパーサーが共通の引数セットを共有することがあります。それらの引数を繰り返し定義する代わりに、すべての共通引数を持ったパーサーを ArgumentParser の parents= 引数に渡すことができます。 parents= 引数は ArgumentParser オブジェクトのリストを受け取り、すべての位置アクションとオプションのアクションをそれらから集め、そのアクションを構築中の ArgumentParser オブジェクトに追加します:
>>> 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'])
Namespace(foo='XXX', parent=2)
>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
多くの親パーサーでは add_help=False を指定します。
そうしないと、ArgumentParser は親と子に一つずつ、計二つの -h/--help オプションを検出してエラーを発生させます。
注釈
parents= に渡す前にパーサーを完全に初期化する必要があります。子パーサーを作成してから親パーサーを変更した場合、その変更は子パーサーに反映されません。
formatter_class¶
ArgumentParser オブジェクトは代わりのフォーマットクラスを指定することでヘルプのフォーマットをカスタマイズできます。現在、4つのフォーマットクラスがあります:
- class argparse.RawDescriptionHelpFormatter¶
- class argparse.RawTextHelpFormatter¶
- class argparse.ArgumentDefaultsHelpFormatter¶
- class argparse.MetavarTypeHelpFormatter¶
RawDescriptionHelpFormatter と RawTextHelpFormatter はどのようにテキストの説明を表示するかを指定できます。デフォルトでは ArgumentParser オブジェクトはコマンドラインヘルプの中の description と epilog を折り返して表示します:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description
... was indented weird
... but that is okay''',
... epilog='''
... likewise for this epilog whose whitespace will
... be cleaned up and whose words will be wrapped
... across a couple lines''')
>>> parser.print_help()
usage: PROG [-h]
this description was indented weird but that is okay
options:
-h, --help show this help message and exit
likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
formatter_class= に RawDescriptionHelpFormatter を渡した場合、 description と epilog は整形済みとされ改行されません:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.RawDescriptionHelpFormatter,
... description=textwrap.dedent('''\
... Please do not mess up this text!
... --------------------------------
... I have indented it
... exactly the way
... I want it
... '''))
>>> parser.print_help()
usage: PROG [-h]
Please do not mess up this text!
--------------------------------
I have indented it
exactly the way
I want it
options:
-h, --help show this help message and exit
RawTextHelpFormatter は、引数の説明を含むすべてのヘルプテキストの空白を保持します。
ただし、連続する改行は一つにまとめられます。
複数の空行を残したい場合は、改行の間にスペースを入れてください。
ArgumentDefaultsHelpFormatter は各引数のデフォルト値を自動的にヘルプに追加します:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar ...]
positional arguments:
bar BAR! (default: [1, 2, 3])
options:
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
MetavarTypeHelpFormatter は、各引数の値の表示名に type 引数の値を使用します (通常は dest の値が使用されます):
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
options:
-h, --help show this help message and exit
--foo int
prefix_chars¶
ほとんどのコマンドラインオプションでは、-f/--foo のように接頭辞として - を使います。
+f や /foo のように、別の文字や追加の文字を接頭辞としてサポートする必要があるパーサーでは、ArgumentParser コンストラクターの prefix_chars= 引数でそれらの文字を指定できます。
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
prefix_chars= 引数のデフォルトは '-' です。- を含まない文字セットを指定すると、-f/--foo オプションが使用できなくなります。
fromfile_prefix_chars¶
ときどき、非常に長い引数リストを扱う場合に、その引数リストを毎回コマンドラインにタイプする代わりにファイルに置いておきたい場合があります。ArgumentParser のコンストラクターに fromfile_prefix_chars= 引数が渡された場合、指定された文字のいずれかで始まる引数はファイルとして扱われ、そのファイルに含まれる引数リストに置換されます。例えば:
>>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:
... fp.write('-f\nbar')
...
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
Arguments read from a file must be one per line by default (but see also
convert_arg_line_to_args()) and are treated as if they
were in the same place as the original file referencing argument on the command
line. So in the example above, the expression ['-f', 'foo', '@args.txt']
is considered equivalent to the expression ['-f', 'foo', '-f', 'bar'].
注釈
Each line is treated as a single argument, so an empty line is read as an
empty string ('').
ArgumentParser は、引数を記述したファイルを filesystem encoding and error handler を使って読み込みます。
fromfile_prefix_chars= 引数のデフォルト値は None で、引数がファイル参照として扱われることがないことを意味しています。
バージョン 3.12 で変更: ArgumentParser が引数ファイルの読み込みに使うエンコーディングとエラーハンドラーを、デフォルト値 (locale.getpreferredencoding(False) と "strict" など) から filesystem encoding and error handler に変更しました。
Windows では、引数ファイルを ANSI コードページではなく UTF-8 でエンコードしてください。
argument_default¶
一般的には、引数のデフォルト値は add_argument() メソッドにデフォルト値を渡すか、set_defaults() メソッドに名前と値のペアを渡すことで指定します。しかしまれに、1つのパーサー全体に適用されるデフォルト引数が便利なことがあります。これを行うには、 ArgumentParser に argument_default= キーワード引数を渡します。例えば、全体で parse_args() メソッド呼び出しの属性の生成を抑制するには、argument_default=SUPPRESS を指定します:
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
allow_abbrev¶
通常、ArgumentParser の parse_args() に引数のリストを渡すとき、長いオプションは 短縮しても認識されます。
この機能は、allow_abbrev に False を指定することで無効にできます:
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
Added in version 3.5.
conflict_handler¶
ArgumentParser オブジェクトは同じオプション文字列に対して複数のアクションを許可していません。
デフォルトでは、ArgumentParser オブジェクトは、すでに利用されているオプション文字列を使って新しい引数をつくろうとしたときに例外を送出します:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
ときどき (例えば parents を利用する場合など)、古い引数を同じオプション文字列で上書きするほうが便利な場合があります。この動作をするには、ArgumentParser の conflict_handler= 引数に 'resolve' を渡します:
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]
options:
-h, --help show this help message and exit
-f FOO old foo help
--foo FOO new foo help
ArgumentParser オブジェクトは、すべてのオプション文字列が上書きされた場合にだけアクションを削除することに注目してください。上の例では、 --foo オプション文字列だけが上書きされているので、古い -f/--foo アクションは -f アクションとして残っています。
add_help¶
デフォルトでは、ArgumentParser オブジェクトに、パーサーのヘルプを表示するオプションが追加されます。
コマンドラインで -h または --help を指定すると、ArgumentParser のヘルプが表示されます。
必要に応じて、この help オプションを無効にする場合があります。これは ArgumentParser の add_help= 引数に False を渡すことで可能です:
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]
options:
--foo FOO foo help
ヘルプオプションは通常 -h/--help です。例外は prefix_chars= が指定されてその中に - が無かった場合で、その場合は -h と --help は有効なオプションではありません。この場合、prefix_chars の最初の文字がヘルプオプションの接頭辞として利用されます:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
>>> parser.print_help()
usage: PROG [+h]
options:
+h, ++help show this help message and exit
exit_on_error¶
通常、ArgumentParser の parse_args() メソッドに不正な引数リストを渡すと、sys.stderr に メッセージ を表示し、終了ステータス 2 で終了します。
もしエラーを例外としてプログラム内でキャッチしたい場合は、exit_on_error を False に設定してください:
>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
>>> try:
... parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
... print('Catching an argumentError')
...
Catching an argumentError
Added in version 3.9.
add_argument() メソッド¶
- ArgumentParser.add_argument(name or flags..., *[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest][, deprecated])¶
1つのコマンドライン引数がどう解析されるかを定義します。各引数についての詳細は後述しますが、簡単に言うと:
name or flags - 名前、またはオプション文字列のリスト (例:
'foo'、'-f', '--foo')。action - コマンドラインにこの引数があったときのアクション。
nargs - 受け取るべきコマンドライン引数の数。
default - コマンドラインに対応する引数が存在せず、さらに namespace オブジェクトにも存在しない場合に利用される値。
type - コマンドライン引数が変換されるべき型。
choices - 引数として許される値のシーケンス。
required - コマンドラインオプションが省略可能かどうか (オプション引数のみ)。
help - 引数が何なのかを示す簡潔な説明。
metavar - 使用法メッセージの中で使われる引数の名前。
dest -
parse_args()が返すオブジェクトに追加される属性名。deprecated - この引数の使用が非推奨かどうか。
The method returns an
Actionobject representing the argument.
以下の節では各オプションの利用方法を説明します。
name または flags¶
add_argument() メソッドは、指定されている引数が -f や --foo のようなオプション引数なのか、ファイル名リストなどの位置引数なのかを知る必要があります。
そのため、 add_argument() に初めに渡される引数は、一連のフラグか、単一の引数名のどちらかになります。
たとえば、オプション引数は次のように作成します:
>>> parser.add_argument('-f', '--foo')
一方、位置引数は次のように作成します:
>>> parser.add_argument('bar')
parse_args() が呼ばれたとき、オプション引数は接頭辞 - により識別され、それ以外の引数は位置引数として扱われます:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
action¶
ArgumentParser オブジェクトはコマンドライン引数にアクションを割り当てます。このアクションは、割り当てられたコマンドライン引数に関してどんな処理でもできますが、ほとんどのアクションは単に parse_args() が返すオブジェクトに属性を追加するだけです。action キーワード引数は、コマンドライン引数がどう処理されるかを指定します。提供されているアクションは:
'store'- 引数の値を格納します。 これがデフォルトのアクションです。'store_const'- このアクションは const キーワード引数で指定された値を格納します。const キーワード引数のデフォルト値はNoneであることに注意してください。'store_const'アクションは、何かの種類のフラグを指定するオプション引数によく使われます。例えば:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.parse_args(['--foo']) Namespace(foo=42)
'store_true'and'store_false'- These are special cases of'store_const'that respectively store the valuesTrueandFalsewith default values ofFalseandTrue:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('--bar', action='store_false') >>> parser.add_argument('--baz', action='store_false') >>> parser.parse_args('--foo --bar'.split()) Namespace(foo=True, bar=False, baz=True)
'append'- This appends each argument value to a list. It is useful for allowing an option to be specified multiple times. If the default value is a non-empty list, the parsed value will start with the default list's elements and any values from the command line will be appended after those default values. Example usage:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append', default=['0']) >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['0', '1', '2'])
'append_const'- This appends the value specified by the const keyword argument to a list; note that the const keyword argument defaults toNone. The'append_const'action is typically useful when multiple arguments need to store constants to the same list. For example:>>> 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'>])
'extend'- This appends each item from a multi-value argument to a list. The'extend'action is typically used with the nargs keyword argument value'+'or'*'. Note that when nargs isNone(the default) or'?', each character of the argument string will be appended to the list. Example usage:>>> parser = argparse.ArgumentParser() >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) Namespace(foo=['f1', 'f2', 'f3', 'f4'])
Added in version 3.8.
'count'- This counts the number of times an argument occurs. For example, this is useful for increasing verbosity levels:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--verbose', '-v', action='count', default=0) >>> parser.parse_args(['-vvv']) Namespace(verbose=3)
Unless explicitly set, the default will be
None. If the default value is a non-zero number, the count starts from that number rather than from zero.'help'- 現在のパーサーのすべてのオプションについてヘルプを表示し、終了します。 デフォルトでは、このヘルプアクションはパーサーに自動的に追加されます。 出力の生成方法の詳細はArgumentParserを参照してください。'version'- このアクションはadd_argument()の呼び出しにversion=キーワード引数を期待します。指定されたときはバージョン情報を表示して終了します:>>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0') >>> parser.parse_args(['--version']) PROG 2.0
You may also specify an arbitrary action by passing an Action subclass
(e.g. BooleanOptionalAction) or other object that implements the same
interface. Only actions that consume command-line arguments (e.g. 'store',
'append', 'extend', or custom actions with non-zero nargs) can be used
with positional arguments.
カスタムアクションを作るには、Action を継承して __call__() メソッドをオーバーライドし、必要に応じて __init__() と format_usage() メソッドもオーバーライドする方法を推奨します。
register() メソッドでカスタムアクションを登録し、その登録名で参照することもできます。
カスタムアクションの例です:
>>> class FooAction(argparse.Action):
... def __init__(self, option_strings, dest, nargs=None, **kwargs):
... if nargs is not None:
... raise ValueError("nargs not allowed")
... super().__init__(option_strings, dest, **kwargs)
... def __call__(self, parser, namespace, values, option_string=None):
... print('%r %r %r' % (namespace, values, option_string))
... setattr(namespace, self.dest, values)
...
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=FooAction)
>>> parser.add_argument('bar', action=FooAction)
>>> args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
>>> args
Namespace(bar='1', foo='2')
詳細は Action を参照してください。
nargs¶
ArgumentParser オブジェクトは通常、一つのコマンドライン引数に対して一つのアクションを実行します。
nargs キーワード引数を使うと、一つのアクションに別の個数のコマンドライン引数を対応させられます。
多義性のある引数の指定 も参照してください。
指定できる値は次のとおりです。
N(整数) --N個の引数がコマンドラインから集められ、リストに格納されます。例えば:>>> 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'])
nargs=1は1要素のリストを作ることに注意してください。これはデフォルトの、要素がそのまま属性になる動作とは異なります。
'?'-- 可能なら1つの引数がコマンドラインから取られ、1つのアイテムを作ります。コマンドライン引数が存在しない場合、default の値が生成されます。オプション引数の場合、さらにオプション引数が指定され、その後にコマンドライン引数がないというケースもありえます。この場合は const の値が生成されます。この動作の例です:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='?', const='c', default='d') >>> parser.add_argument('bar', nargs='?', default='d') >>> parser.parse_args(['XX', '--foo', 'YY']) Namespace(bar='XX', foo='YY') >>> parser.parse_args(['XX', '--foo']) Namespace(bar='XX', foo='c') >>> parser.parse_args([]) Namespace(bar='d', foo='d')
nargs='?'のよくある利用例の1つは、入出力ファイルの指定オプションです:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), ... default=sys.stdin) >>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), ... default=sys.stdout) >>> parser.parse_args(['input.txt', 'output.txt']) Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>) >>> parser.parse_args([]) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
'*'-- すべてのコマンドライン引数がリストに集められます。複数の位置引数がnargs='*'を持つことにあまり意味はありませんが、複数のオプション引数がnargs='*'を持つことはありえます。例えば:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='*') >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*') >>> parser.parse_args('a b --foo x y --bar 1 2'.split()) Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
'+'. Just like'*', all command-line arguments present are gathered into a list. Additionally, an error message will be generated if there wasn't at least one command-line argument present. For example:>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', nargs='+') >>> parser.parse_args(['a', 'b']) Namespace(foo=['a', 'b']) >>> parser.parse_args([]) usage: PROG [-h] foo [foo ...] PROG: error: the following arguments are required: foo
nargs キーワード引数を指定しなかった場合、消費する引数の数は action によって決まります。
通常は、一つのコマンドライン引数を消費して、リストではなく単一の値を生成します。
コマンドライン引数を消費しないアクション ('store_const' など) では、nargs=0 が設定されます。
const¶
add_argument() の const 引数は、コマンドライン引数から読み込まれないけれども ArgumentParser のいくつかのアクションで必要とされる値のために使われます。この引数のよくある2つの使用法は:
add_argument()がaction='store_const'かaction='append_const'で呼び出されたとき、これらのアクションはconstの値をparse_args()が返すオブジェクトの属性に追加します。サンプルは action の説明を参照してください。constがadd_argument()に与えられなければ、Noneのデフォルト値を受け取ります。When
add_argument()is called with option strings (like-for--foo) andnargs='?'. This creates an optional argument that can be followed by zero or one command-line arguments. When parsing the command line, if the option string is encountered with no command-line argument following it, the value fromconstwill be used. See the nargs description for examples.
バージョン 3.11 で変更: action='append_const' や action='store_const' の場合も含め、デフォルトでは const=None です。
default¶
すべてのオプション引数といくつかの位置引数はコマンドライン上で省略されることがあります。 add_argument() の default キーワード引数 (デフォルト: None) は、コマンドライン引数が存在しなかった場合に利用する値を指定します。オプション引数では、オプション文字列がコマンドライン上に存在しなかったときに default の値が利用されます:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
対象の名前空間にすでに属性が設定されている場合、アクションの default はその値を上書きしません。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
default の値が文字列の場合、パーサーは値をコマンドライン引数のように解析します。具体的には、パーサーは返り値 Namespace の属性を設定する前に、type 変換引数が与えられていればそれらを適用します。そうでない場合、パーサーは値をそのまま使用します:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
nargs が ? か * である位置引数では、コマンドライン引数が指定されなかった場合 default の値が使われます。例えば:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
Because nargs='*' gathers any supplied values into a list, an absent
positional argument yields an empty list ([]). Only a non-None
default overrides this (so default=None still gives []).
required の引数では default の値は無視されます。
例えば、nargs が ? や * 以外の位置引数や、required=True を指定したオプション引数が該当します。
default=argparse.SUPPRESS を渡すと、コマンドライン引数が存在しないときに属性の追加をしなくなります:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=argparse.SUPPRESS)
>>> parser.parse_args([])
Namespace()
>>> parser.parse_args(['--foo', '1'])
Namespace(foo='1')
type¶
デフォルトでは、パーサーはコマンドライン引数を単なる文字列として読み込みます。しかし、それらの文字列を float, int など別の型として扱うべき事がよくあります。add_argument() の type キーワード引数に指定する type converter により、必要な型チェックと型変換を行うことができます。
もし type キーワードが default キーワードとともに使用された場合、default の値が文字列のときのみ、type converter による変換などが行われます。
type には、一つの文字列を受け取る呼び出し可能オブジェクト、または登録済みの型の名前 (register() を参照) を渡せます。
この関数が ArgumentTypeError、TypeError、ValueError を送出すると、その例外を捕捉して読みやすい形式のエラーメッセージを表示します。
それ以外の例外は処理しません。
一般的なビルトインデータ型や関数を type 引数の値として直接指定できます:
import argparse
import pathlib
parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)
ユーザが定義した関数も使用できます:
>>> def hyphenated(string):
... return '-'.join([word[:4] for word in string.casefold().split()])
...
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('short_title', type=hyphenated)
>>> parser.parse_args(['"The Tale of Two Cities"'])
Namespace(short_title='"the-tale-of-two-citi')
The bool() function is not recommended as a type converter. All it does
is convert empty strings to False and non-empty strings to True.
This is usually not what is desired:
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('--verbose', type=bool)
>>> parser.parse_args(['--verbose', 'False'])
Namespace(verbose=True)
See BooleanOptionalAction or action='store_true' for common
alternatives.
一般論として、type キーワードに指定するものは、せいぜい上記の3種類の例外を発生するくらいの、お手軽な変換に限るべきです。より複雑な (interesting) エラー処理、またはリソース管理を伴うものは、引数を解析したあとに別個の処理として行うべきです。
たとえば、JSON または YAML からの変換は複雑なエラーケースを持つので、type がサポートする以上のエラー表示を必要とするでしょう。(JSON デコーダが発生しうる) JSONDecodeError は適切に整形されて表示されません。また、FileNotFoundError が発生しても parser は何も処理しません。
FileType でさえ、type キーワードでの使用には制限があります。
ある引数で FileType を使い、その後の引数でエラーが起きると、エラーは報告されますが、ファイルは自動的には閉じられません。
この場合は、引数の解析が終わってから with 文でファイルを管理する方が適切です。
なお、引数が、あらかじめ決められた値の候補のいずれかに一致するかをチェックしたいだけの場合には、代わりに choices キーワードの使用を検討してください。
choices¶
コマンドライン引数をいくつかの選択肢の中から選ばせたい場合があります。 これは add_argument() に シーケンスオブジェクトを 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')
任意のシーケンスを choices に渡すことができます。すなわち、list オブジェクト、 tuple オブジェクト、カスタムシーケンスはすべてサポートされています。
ただし、enum.Enum を渡すことは推奨されません。使用方法、ヘルプ、エラーメッセージなどでどのように表示されるかを制御することが難いからです。
Note that choices are checked after any type conversions have been performed, so objects in choices should match the type specified. This can make choices appear unfamiliar in usage, help, or error messages.
To keep choices user-friendly, consider a custom type wrapper that converts and formats values, or omit type and handle conversion in your application code.
ヘルプテキストにおいて整形された choices の値は、通常 dest から生成されるデフォルトの metavar に優先します。ユーザーは dest パラメータを目にすることがないため、この振る舞いは基本的には望ましいものです。もしこの表示方法が望ましくない場合 (おそらく多くの選択肢がある場合など) は、 metavar を明示的に指定してください。
required¶
argparse モジュールは通常、-f や --bar のようなフラグを、コマンドラインで常に省略できる オプション 引数として扱います。
オプションを 必須 にするには、add_argument() の required= キーワード引数に True を指定します。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo
上の例のように、引数が required と指定されると、parse_args() はそのフラグがコマンドラインに存在しないときにエラーを表示します。
注釈
ユーザーは、通常 フラグ の指定は 任意 であると認識しているため、必須にするのは一般的には悪いやり方で、できる限り避けるべきです。
help¶
help の値には、引数の簡潔な説明を文字列で指定します。
ユーザーがヘルプを要求すると (通常はコマンドラインで -h または --help を指定します)、各引数とともにこの help の説明が表示されます。
help 文字列には、プログラム名や引数の default などを繰り返し記述するのを避けるためのフォーマット指定子を含めることができます。利用できる指定子には、プログラム名 %(prog)s と、 %(default)s や %(type)s など add_argument() のキーワード引数の多くが含まれます:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
... help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h] [bar]
positional arguments:
bar the bar to frobble (default: 42)
options:
-h, --help show this help message and exit
ヘルプ文字列は %-フォーマットをサポートしているので、ヘルプ文字列内にリテラル % を表示したい場合は %% のようにエスケープしなければなりません。
argparse では、help の値を argparse.SUPPRESS に設定すると、そのオプションをヘルプに表示しないようにできます。
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', help=argparse.SUPPRESS)
>>> parser.print_help()
usage: frobble [-h]
options:
-h, --help show this help message and exit
metavar¶
ArgumentParser がヘルプを生成する際には、受け付ける各引数を表す名前が必要です。
デフォルトでは、ArgumentParser オブジェクトは dest の値を各引数の「名前」として使います。
位置引数のアクションでは dest の値をそのまま使い、オプション引数のアクションでは dest の値を大文字にして使います。
そのため、dest='bar' の位置引数は bar と表示されます。
コマンドライン引数を一つ受け取るオプション --foo では、その値が FOO と表示されます。
例えば次のようになります。
>>> 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
options:
-h, --help show this help message and exit
--foo FOO
代わりの名前を、metavar として指定できます:
>>> parser = argparse.ArgumentParser()
>>> 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
options:
-h, --help show this help message and exit
--foo YYY
metavar は 表示される 名前だけを変更することに注意してください。parse_args() の返すオブジェクトの属性名は dest の値のままです。
nargs を指定した場合、metavar が複数回利用されるかもしれません。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]
options:
-h, --help show this help message and exit
-x X X
--foo bar baz
dest¶
ほとんどの ArgumentParser のアクションは parse_args() が返すオブジェクトに対する属性として値を追加します。この属性の名前は add_argument() の dest キーワード引数によって決定されます。位置引数のアクションについては、 dest は通常 add_argument() の第一引数として渡します:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
オプション引数のアクションについては、 dest の値は通常オプション文字列から生成されます。 ArgumentParser は最初の長いオプション文字列を選択し、先頭の -- を除去することで dest の値を生成します。長いオプション文字列が指定されていない場合、最初の短いオプション文字列から先頭の - 文字を除去することで 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')
dest にカスタムの属性名を与えることも可能です:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
Multiple arguments may share the same dest. By default, the value from the
last such argument given on the command line wins. Use action='append' to
collect values from all of them into a list instead. For conflicting option
strings rather than dest names, see conflict_handler.
deprecated¶
プロジェクトの開発を続けるうちに、コマンドライン引数を削除する必要が生じることがあります。
削除する前に、その引数が非推奨となり、削除される予定であることをユーザーに知らせてください。
add_argument() の deprecated キーワード引数は、その引数が非推奨で将来削除されるかどうかを指定し、デフォルトは False です。
deprecated が True の引数を使うと、sys.stderr に警告が表示されます。
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='snake.py')
>>> parser.add_argument('--legs', default=0, type=int, deprecated=True)
>>> parser.parse_args([])
Namespace(legs=0)
>>> parser.parse_args(['--legs', '4'])
snake.py: warning: option '--legs' is deprecated
Namespace(legs=4)
Added in version 3.13.
Action クラス¶
Action クラスは Action API を実装します。
この API は、呼び出されると、コマンドライン引数を処理する呼び出し可能オブジェクトを返します。
この API に従うオブジェクトであれば、add_argument() の action パラメーターに渡せます。
- class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)¶
ArgumentParserはActionオブジェクトを使って、コマンドラインの一つ以上の文字列から一つの引数を解析するために必要な情報を表します。Actionクラスは、二つの位置引数と、ArgumentParser.add_argument()に渡されたキーワード引数 (action自身を除く) を受け付けなければなりません。Actionのインスタンス (またはactionパラメーターに渡した呼び出し可能オブジェクトの返り値) には、dest、option_strings、default、type、required、helpなどの属性を定義してください。 これらの属性を確実に定義する最も簡単な方法は、Action.__init__()を呼び出すことです。- __call__(parser, namespace, values, option_string=None)¶
Actionのインスタンスは呼び出し可能でなければなりません。 そのため、サブクラスでは__call__()メソッドをオーバーライドし、次の四つの引数を受け付けるようにしてください。parser - このアクションを含む
ArgumentParserオブジェクト。namespace -
parse_args()が返すNamespaceオブジェクト。 ほとんどのアクションはsetattr()を使って、このオブジェクトに属性を追加します。values - 対応するコマンドライン引数に型変換を適用した値。 型変換は
add_argument()の type キーワード引数で指定します。option_string - このアクションの呼び出しに使われたオプション文字列。
option_string引数は省略可能で、位置引数に対応するアクションでは指定されません。
__call__()メソッドは任意の処理を行えますが、通常はdestとvaluesに基づいてnamespaceの属性を設定します。
- format_usage()¶
Actionのサブクラスでは、引数を取らず、プログラムの使用法の表示に使う文字列を返すformat_usage()メソッドを定義できます。 このメソッドを定義しなければ、適切なデフォルトの表示が使われます。
- class argparse.BooleanOptionalAction¶
A subclass of
Actionfor handling boolean flags with positive and negative options. Adding a single argument such as--fooautomatically creates both--fooand--no-foooptions, storingTrueandFalserespectively:>>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) >>> parser.parse_args(['--no-foo']) Namespace(foo=False)
Added in version 3.9.
parse_args() メソッド¶
- ArgumentParser.parse_args(args=None, namespace=None)¶
引数の文字列をオブジェクトに変換し、namespace オブジェクトの属性に代入します。結果の namespace オブジェクトを返します。
どのようなオブジェクトを作り、どう代入するかは、それまでの
add_argument()の呼び出しで決まります。 詳細はadd_argument()のドキュメントを参照してください。
オプション値の文法¶
parse_args() メソッドは、オプションの値がある場合、そのオプションの値の指定に複数の方法をサポートしています。もっとも単純な場合には、オプションとその値は次のように2つの別々の引数として渡されます:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
Namespace(foo='FOO', x=None)
長いオプション (1文字よりも長い名前を持ったオプション) では、オプションとその値は次のように = で区切られた1つのコマンドライン引数として渡すこともできます:
>>> parser.parse_args(['--foo=FOO'])
Namespace(foo='FOO', x=None)
短いオプション (1文字のオプション) では、オプションとその値は次のように連結して渡すことができます:
>>> parser.parse_args(['-xX'])
Namespace(foo=None, x='X')
最後の1つのオプションだけが値を要求する場合、または値を要求するオプションがない場合、複数の短いオプションは次のように1つの接頭辞 - だけで連結できます:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
Namespace(x=True, y=True, z='Z')
不正な引数¶
parse_args() は、コマンドラインの解析中に、曖昧なオプション、不正な型、不正なオプション、位置引数の数の不一致などのエラーを検証します。それらのエラーが発生した場合、エラーメッセージと使用法メッセージを表示して終了します:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')
>>> # invalid type
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'
>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: unrecognized arguments: --bar
>>> # wrong number of arguments
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: unrecognized arguments: badger
- を含む引数¶
parse_args() メソッドは、ユーザーが明らかなミスをした場合はエラーを表示しますが、いくつか本質的に曖昧な場面があります。例えば、コマンドライン引数 -1 は、オプションの指定かもしれませんし位置引数かもしれません。parse_args() メソッドはこれを次のように扱います: 負の数として解釈でき、パーサーに負の数のように解釈できるオプションが存在しない場合にのみ、- で始まる位置引数になりえます:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')
>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')
>>> # no negative number options, so -1 and -5 are positional arguments
>>> parser.parse_args(['-x', '-1', '-5'])
Namespace(foo='-5', x='-1')
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')
>>> # negative number options present, so -1 is an option
>>> parser.parse_args(['-1', 'X'])
Namespace(foo=None, one='X')
>>> # negative number options present, so -2 is an option
>>> parser.parse_args(['-2'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: unrecognized arguments: -2
>>> # negative number options present, so both -1s are options
>>> parser.parse_args(['-1', '-1'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: argument -1: expected one argument
- で始まる位置引数があって、それが負の数として解釈できない場合、ダミーの引数 '--' を挿入して、parse_args() にそれ以降のすべてが位置引数だと教えることができます:
>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)
詳細は argparse の HOWTO の曖昧な引数についての説明 も参照してください。
引数の短縮形 (先頭文字でのマッチング)¶
parse_args() メソッドは、デフォルトで、長いオプションに曖昧さがない (先頭文字列が一意である) かぎり、先頭文字列に短縮して指定できます:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
先頭の文字が同じ引数が複数ある場合に短縮指定を行うとエラーを発生させます。この機能は allow_abbrev に False を指定することで無効にできます。
sys.argv 以外¶
ArgumentParser で sys.argv 以外の引数を解析したい場合もあります。
その場合は、parse_args() に文字列のリストを渡してください。
対話プロンプトでのテストに便利です。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
... 'integers', metavar='int', type=int, choices=range(10),
... nargs='+', help='an integer in the range 0..9')
>>> parser.add_argument(
... '--sum', dest='accumulate', action='store_const', const=sum,
... default=max, help='sum the integers (default: find the max)')
>>> parser.parse_args(['1', '2', '3', '4'])
Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
Namespace オブジェクト¶
- class argparse.Namespace¶
parse_args()が属性を格納して返すためのオブジェクトにデフォルトで使用されるシンプルなクラスです。このクラスはシンプルに設計されており、単に読みやすい文字列表現を持った
objectのサブクラスです。もし属性を辞書のように扱える方が良ければ、標準的な Python のイディオムvars()を利用できます:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> args = parser.parse_args(['--foo', 'BAR']) >>> vars(args) {'foo': 'BAR'}
ArgumentParserが、新しいNamespaceオブジェクトではなく、既存のオブジェクトに属性を設定する方が良い場合があります。これはnamespace=キーワード引数を指定することで可能です:>>> class C: ... pass ... >>> c = C() >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) >>> c.foo 'BAR'
その他のユーティリティ¶
Subcommands¶
- ArgumentParser.add_subparsers(*[, title][, description][, prog][, parser_class][, action][, dest][, required][, help][, metavar])¶
多くのプログラムは、機能をいくつかのサブコマンドに分けています。 例えば
svnプログラムでは、svn checkout、svn update、svn commitなどのサブコマンドを呼び出せます。 それぞれ異なる種類のコマンドライン引数を必要とする複数の機能を持つプログラムでは、このように分ける方法が特に適しています。ArgumentParserではadd_subparsers()メソッドでサブコマンドを作成できます。 通常、add_subparsers()は引数なしで呼び出し、専用のアクションオブジェクトを返します。 このオブジェクトのadd_parser()メソッドは、コマンド名と任意のArgumentParserコンストラクター引数を受け取り、通常と同じように設定できるArgumentParserオブジェクトを返します。引数の説明:
title - ヘルプに表示するサブパーサーグループのタイトル。 デフォルトでは、
descriptionが指定されていれば "subcommands"、そうでなければ位置引数のタイトルを使います。description - ヘルプに表示するサブパーサーグループの説明。 デフォルトは
Noneです。prog - usage information that will be displayed with subcommand help, by default the name of the program and any positional arguments before the subparser argument
parser_class - サブパーサーのインスタンスを作るクラス。 デフォルトでは、現在のパーサーのクラス (
ArgumentParserなど) です。action - コマンドラインにこの引数があったときの基本のアクション。
dest - name of the attribute under which subcommand name will be stored; by default
Noneand no value is storedrequired - サブコマンドが必須であるかどうかを指定し、デフォルトは
Falseです。(3.7 より追加)help - ヘルプ出力に表示されるサブパーサーグループのヘルプです。デフォルトは
Noneですmetavar - ヘルプで利用可能なサブコマンドを表す文字列。 デフォルトは
Noneで、{cmd1, cmd2, ..} の形式で表示されます。
いくつかの使用例:
>>> # 最上位のパーサーを作成する >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') >>> subparsers = parser.add_subparsers(help='subcommand help') >>> >>> # "a" コマンド用のパーサーを作成する >>> parser_a = subparsers.add_parser('a', help='a help') >>> parser_a.add_argument('bar', type=int, help='bar help') >>> >>> # "b" コマンド用のパーサーを作成する >>> parser_b = subparsers.add_parser('b', help='b help') >>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help') >>> >>> # 引数リストを解析する >>> parser.parse_args(['a', '12']) Namespace(bar=12, foo=False) >>> parser.parse_args(['--foo', 'b', '--baz', 'Z']) Namespace(baz='Z', foo=True)
parse_args()が返すオブジェクトにはメインパーサーとコマンドラインで選択されたサブパーサーによる属性だけが設定されており、選択されなかったサブコマンドのパーサーの属性が設定されていないことに注意してください。このため、上の例では、aコマンドが指定されたときはfoo,bar属性だけが存在し、bコマンドが指定されたときはfoo,baz属性だけが存在しています。If a subparser defines an argument with the same
destas the parent parser, the two share a single namespace attribute, so the parent's value won't be retained. Users should give them distinctdestvalues to keep both.同じように、サブパーサーにヘルプメッセージが要求された場合は、そのパーサーに対するヘルプだけが表示されます。ヘルプメッセージには親パーサーや兄弟パーサーのヘルプメッセージを表示しません。 (ただし、各サブパーサーコマンドのヘルプメッセージは、上の例にもあるように
add_parser()のhelp=引数によって指定できます)>>> parser.parse_args(['--help']) usage: PROG [-h] [--foo] {a,b} ... positional arguments: {a,b} subcommand help a a help b b help options: -h, --help show this help message and exit --foo foo help >>> parser.parse_args(['a', '--help']) usage: PROG a [-h] bar positional arguments: bar bar help options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] options: -h, --help show this help message and exit --baz {X,Y,Z} baz help
add_subparsers()メソッドはtitleとdescriptionキーワード引数もサポートしています。どちらかが存在する場合、サブパーサーのコマンドはヘルプ出力でそれぞれのグループの中に表示されます。例えば:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(title='subcommands', ... description='valid subcommands', ... help='additional help') >>> subparsers.add_parser('foo') >>> subparsers.add_parser('bar') >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... options: -h, --help show this help message and exit subcommands: valid subcommands {foo,bar} additional help
Furthermore,
add_parser()supports an additional aliases argument, which allows multiple strings to refer to the same subparser. This example, likesvn, aliasescoas a shorthand forcheckout:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> checkout = subparsers.add_parser('checkout', aliases=['co']) >>> checkout.add_argument('foo') >>> parser.parse_args(['co', 'bar']) Namespace(foo='bar')
add_parser()supports also an additional deprecated argument, which allows to deprecate the subparser.>>> import argparse >>> parser = argparse.ArgumentParser(prog='chicken.py') >>> subparsers = parser.add_subparsers() >>> run = subparsers.add_parser('run') >>> fly = subparsers.add_parser('fly', deprecated=True) >>> parser.parse_args(['fly']) chicken.py: warning: command 'fly' is deprecated Namespace()
Added in version 3.13.
One particularly effective way of handling subcommands is to combine the use of the
add_subparsers()method with calls toset_defaults()so that each subparser knows which Python function it should execute. For example:>>> # サブコマンドの関数 >>> def foo(args): ... print(args.x * args.y) ... >>> def bar(args): ... print('((%s))' % args.z) ... >>> # 最上位のパーサーを作成する >>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(required=True) >>> >>> # "foo" コマンド用のパーサーを作成する >>> parser_foo = subparsers.add_parser('foo') >>> parser_foo.add_argument('-x', type=int, default=1) >>> parser_foo.add_argument('y', type=float) >>> parser_foo.set_defaults(func=foo) >>> >>> # "bar" コマンド用のパーサーを作成する >>> parser_bar = subparsers.add_parser('bar') >>> parser_bar.add_argument('z') >>> parser_bar.set_defaults(func=bar) >>> >>> # 引数を解析し、選ばれた関数を呼び出す >>> args = parser.parse_args('foo 1 -x 2'.split()) >>> args.func(args) 2.0 >>> >>> # 引数を解析し、選ばれた関数を呼び出す >>> args = parser.parse_args('bar XYZYX'.split()) >>> args.func(args) ((XYZYX))
こうすると、
parse_args()が引数の解析が終わってから適切な関数を呼び出すようになります。このように関数をアクションに関連付けるのは一般的にサブパーサーごとに異なるアクションを扱うもっとも簡単な方法です。ただし、実行されたサブパーサーの名前を確認する必要がある場合は、add_subparsers()を呼び出すときにdestキーワードを指定できます:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(dest='subparser_name') >>> subparser1 = subparsers.add_parser('1') >>> subparser1.add_argument('-x') >>> subparser2 = subparsers.add_parser('2') >>> subparser2.add_argument('y') >>> parser.parse_args(['2', 'frobble']) Namespace(subparser_name='2', y='frobble')
バージョン 3.7 で変更: キーワード専用の required パラメーターが追加されました。
FileType オブジェクト¶
- class argparse.FileType(mode='r', bufsize=-1, encoding=None, errors=None)¶
FileTypeファクトリはArgumentParser.add_argument()の type 引数に渡すことができるオブジェクトを生成します。 type がFileTypeオブジェクトである引数はコマンドライン引数を、指定されたモード、バッファーサイズ、エンコーディング、エラー処理でファイルとして開きます (詳細はopen()関数を参照してください。):>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--raw', type=argparse.FileType('wb', 0)) >>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8')) >>> parser.parse_args(['--raw', 'raw.dat', 'file.txt']) Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)
FileType オブジェクトは擬似引数
'-'を識別し、読み込み用のFileTypeであればsys.stdinを、書き込み用のFileTypeであればsys.stdoutに変換します:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', type=argparse.FileType('r')) >>> parser.parse_args(['-']) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)
バージョン 3.4 で変更: Added the encoding and errors parameters.
引数グループ¶
- ArgumentParser.add_argument_group(title=None, description=None, *[, argument_default][, conflict_handler])¶
デフォルトでは、
ArgumentParserはヘルプを表示する際に、コマンドライン引数を "positional arguments" と "options" に分けます。 引数の意味に応じた別の分け方が適している場合は、add_argument_group()メソッドでグループを作成できます。>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group = parser.add_argument_group('group') >>> group.add_argument('--foo', help='foo help') >>> group.add_argument('bar', help='bar help') >>> parser.print_help() usage: PROG [--foo FOO] bar group: bar bar help --foo FOO foo help
add_argument_group()メソッドは、通常のArgumentParserと同じようにadd_argument()メソッドを持つ引数グループオブジェクトを返します。 グループに追加した引数は通常の引数と同じように処理されますが、ヘルプでは別のグループに表示されます。add_argument_group()の title と description 引数で、この表示をカスタマイズできます。>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group1 = parser.add_argument_group('group1', 'group1 description') >>> group1.add_argument('foo', help='foo help') >>> group2 = parser.add_argument_group('group2', 'group2 description') >>> group2.add_argument('--bar', help='bar help') >>> parser.print_help() usage: PROG [--bar BAR] foo group1: group1 description foo foo help group2: group2 description --bar BAR bar help
省略可能なキーワード専用パラメーター argument_default と conflict_handler を使うと、引数グループの動作をより細かく制御できます。 これらの意味は
ArgumentParserコンストラクターと同じですが、パーサー全体ではなく、その引数グループだけに適用されます。ユーザー定義グループにないすべての引数は通常の "位置引数" と "オプション引数" セクションに表示されます。
Within each argument group, arguments are displayed in help output in the order in which they are added.
バージョン 3.11 で変更: Calling
add_argument_group()on an argument group is deprecated. This feature was never supported and does not always work correctly. The function exists on the API by accident through inheritance and will be removed in the future.
相互排他¶
- ArgumentParser.add_mutually_exclusive_group(required=False)¶
相互排他グループを作成します。
argparseは、そのグループに含まれる複数の引数がコマンドラインで同時に指定されないことを確認します。>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group() >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args(['--foo']) Namespace(bar=True, foo=True) >>> parser.parse_args(['--bar']) Namespace(bar=False, foo=False) >>> parser.parse_args(['--foo', '--bar']) usage: PROG [-h] [--foo | --bar] PROG: error: argument --bar: not allowed with argument --foo
add_mutually_exclusive_group()メソッドの引数 required に True 値を指定すると、その相互排他引数のどれか1つを選ぶことが要求されます:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group(required=True) >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args([]) usage: PROG [-h] (--foo | --bar) PROG: error: one of the arguments --foo --bar is required
現在、相互排他引数グループでは
add_argument_group()の title と description 引数はサポートされていません。 ただし、タイトルと説明を持つ引数グループに、相互排他グループを追加することはできます。 例えば次のようになります。>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_argument_group('Group title', 'Group description') >>> exclusive_group = group.add_mutually_exclusive_group(required=True) >>> exclusive_group.add_argument('--foo', help='foo help') >>> exclusive_group.add_argument('--bar', help='bar help') >>> parser.print_help() usage: PROG [-h] (--foo FOO | --bar BAR) options: -h, --help show this help message and exit Group title: Group description --foo FOO foo help --bar BAR bar help
バージョン 3.11 で変更: Calling
add_argument_group()oradd_mutually_exclusive_group()on a mutually exclusive group is deprecated. These features were never supported and do not always work correctly. The functions exist on the API by accident through inheritance and will be removed in the future.
パーサーのデフォルト値¶
- ArgumentParser.set_defaults(**kwargs)¶
ほとんどの場合、
parse_args()が返すオブジェクトの属性はコマンドライン引数の内容と引数のアクションによってのみ決定されます。set_defaults()を使うと与えられたコマンドライン引数の内容によらず追加の属性を決定することが可能です:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', type=int) >>> parser.set_defaults(bar=42, baz='badger') >>> parser.parse_args(['736']) Namespace(bar=42, baz='badger', foo=736)
Note that defaults can be set at both the parser level using
set_defaults()and at the argument level usingadd_argument(). If both are called for the same argument, the last default set for an argument is used:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='bar') >>> parser.set_defaults(foo='spam') >>> parser.parse_args([]) Namespace(foo='spam')
パーサーレベルの default は、複数のパーサーを扱うときに特に便利です。このタイプの例については
add_subparsers()メソッドを参照してください。
- ArgumentParser.get_default(dest)¶
add_argument()かset_defaults()によって指定された、 namespace の属性のデフォルト値を取得します:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='badger') >>> parser.get_default('foo') 'badger'
ヘルプの表示¶
ほとんどの典型的なアプリケーションでは、parse_args() が使用法やエラーメッセージのフォーマットと表示について面倒を見ます。しかし、いくつかのフォーマットメソッドが利用できます:
- ArgumentParser.print_usage(file=None)¶
ArgumentParserがコマンドラインからどう実行されるべきかの短い説明を表示します。 file がNoneの時は、sys.stdoutに出力されます。
- ArgumentParser.print_help(file=None)¶
プログラムの使用法と
ArgumentParserに登録された引数についての情報を含むヘルプメッセージを表示します。 file がNoneの時は、sys.stdoutに出力されます。
これらのメソッドの、表示する代わりにシンプルに文字列を返すバージョンもあります:
- ArgumentParser.format_usage()¶
ArgumentParserがコマンドラインからどう実行されるべきかの短い説明を格納した文字列を返します。
- ArgumentParser.format_help()¶
プログラムの使用法と
ArgumentParserに登録された引数についての情報を含むヘルプメッセージを格納した文字列を返します。
部分解析¶
- ArgumentParser.parse_known_args(args=None, namespace=None)¶
Sometimes a script only needs to handle a specific set of command-line arguments, leaving any unrecognized arguments for another script or program. In these cases, the
parse_known_args()method can be useful.This method works similarly to
parse_args(), but it does not raise an error for extra, unrecognized arguments. Instead, it parses the known arguments and returns a two item tuple that contains the populated namespace and the list of any unrecognized arguments.>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('bar') >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) (Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
警告
先頭文字でのマッチング ルールは parse_known_args() にも適用されます。たとえ既知のオプションの先頭文字に過ぎない場合でも、パーサは引数リストに残さずに、オプションを受け取る場合があります。
ファイル解析のカスタマイズ¶
- ArgumentParser.convert_arg_line_to_args(arg_line)¶
ファイルから引数を読み込む場合 (
ArgumentParserコンストラクターの fromfile_prefix_chars キーワード引数を参照)、1行につき1つの引数を読み込みます。convert_arg_line_to_args()を変更することでこの動作をカスタマイズできます。このメソッドは、引数ファイルから読まれた文字列である1つの引数 arg_line を受け取ります。そしてその文字列を解析した結果の引数のリストを返します。このメソッドはファイルから1行読みこむごとに、順番に呼ばれます。
このメソッドをオーバーライドすると便利なこととして、スペースで区切られた行の単語1つ1つを別々の引数として扱えます。次の例でその方法を示します:
class MyArgumentParser(argparse.ArgumentParser): def convert_arg_line_to_args(self, arg_line): return arg_line.split()
Note that with this override an argument can no longer contain spaces, since each space-separated word becomes a separate argument.
終了メソッド¶
- ArgumentParser.exit(status=0, message=None)¶
このメソッドは、指定された status でプログラムを終了します。 message が指定されていれば、終了前に
sys.stderrに表示します。 このメソッドをオーバーライドして、これらの処理を変更できます。class ErrorCatchingArgumentParser(argparse.ArgumentParser): def exit(self, status=0, message=None): if status: raise Exception(f'Exiting because of an error: {message}') exit(status)
- ArgumentParser.error(message)¶
このメソッドは、message を含む使用法メッセージを
sys.stderrに表示し、ステータスコード 2 でプログラムを終了します。
混在した引数の解析¶
- ArgumentParser.parse_intermixed_args(args=None, namespace=None)¶
- ArgumentParser.parse_known_intermixed_args(args=None, namespace=None)¶
多くの Unix コマンドは、オプション引数と位置引数を混在させることを許しています。
parse_intermixed_args()とparse_known_intermixed_args()メソッドは、このような方法での解析をサポートしています。これらのパーサーは
argparseのすべての機能をサポートしているわけではなく、未対応の機能を使うと例外を送出します。 特に、サブパーサーと、オプション引数と位置引数の両方を含む相互排他グループには対応していません。この例は、
parse_known_args()とparse_intermixed_args()の違いを表しています: 前者は['2', '3']を、解析されない引数として返し、後者は全ての位置引数をrestに入れて返しています:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.add_argument('cmd') >>> parser.add_argument('rest', nargs='*', type=int) >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])
parse_known_intermixed_args()は、解析した内容を含む名前空間と、残りの引数を含んだリストの、2つの要素を持つタプルを返します。parse_intermixed_args()は、解析されない引数が残された場合にはエラーを送出します。Added in version 3.7.
独自の型やアクションの登録¶
- ArgumentParser.register(registry_name, value, object)¶
エラーメッセージに独自の文字列を使って、出力をユーザーにわかりやすくしたい場合があります。 その場合は、
register()で独自のアクションや型をパーサーに登録すると、呼び出し可能オブジェクトの名前の代わりに登録名で型を参照できます。register()メソッドは三つの引数を受け取ります。 registry_name はオブジェクトを格納する内部レジストリ (action、typeなど)、value は登録に使うキー、objectは登録する呼び出し可能オブジェクトです。次の例は、パーサーに独自の型を登録する方法を示します。
>>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16)) >>> parser.add_argument('--foo', type='hexadecimal integer') _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False) >>> parser.parse_args(['--foo', '0xFA']) Namespace(foo=250) >>> parser.parse_args(['--foo', '1.2']) usage: PROG [-h] [--foo FOO] PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'
例外¶
- exception argparse.ArgumentError¶
引数 (オプション引数または位置引数) の生成時または利用時のエラーです。
この例外の文字列表現は、エラーの原因となった引数についての情報を補足するメッセージです。
- exception argparse.ArgumentTypeError¶
コマンドラインの文字列を、指定された型に変換するのに失敗した時に送出されます。
ガイドとチュートリアル