コマンドラインの引数を解釈するモジュール。
かなり膨大な機能持つモジュールらしいので基本的なところをざっくりと説明。
argparse を使用するときに最初にすることは、パーサオブジェクトを作成して指定される引数をそのパーサオブジェクトへ伝えます。パーサオブジェクトはプログラムの実行時にコマンドライン引数を処理するために使用されます。
コンストラクタは ArgumentParser クラスです。そのコンストラクタは、プログラムのヘルプ内容を作成したり、グローバルな動作や設定を行う複数の引数を取ります。
argparse は完全な引数処理ライブラリです。
parser = argparse.ArgumentParser()
使用する際の基本的な流れ
- 基本的な流れとしては、argparse.ArgumentParser のオブジェクトを作成し、add_argument() で引数を追加し、args = parse_args() でコマンドラインの解析を行う。結果は、 args のメンバ変数としてアクセスできる。
- argparse.ArgumentParserコンストラクタの引数にもいろいろあるが、とりあえずはプログラムの概要を示すdescription引数だけ与えておけばよい。
- add_argument() では dest を指定すると便利。
dest で指定した値が、参照するときの属性名になる。
また、default を指定すると、ユーザが引数を指定しなかった場合のデフォルト値を決めることができる。
(逆に default を指定しないと、解析結果に None が出てしまう。)
#▼オブジェクトの作成
parser = argparse.ArgumentParser(description='Sample program')
parser.add_argument('bar') # 引数を追加します
parser.add_argument('-f', '--foo') # オプション引数を追加します
parser.add_argument('-r', required=True) # このオプション引数は必須です
parser.add_argument('--version', action='version', version='%(prog)s 2.0') # version
#▼コマンドラインの解析
args = parser.parse_args()
引数の定義
引数は add_argument() メソッドへの引数で指定されます。
ここで指定された引数は、様々なアクションのトリガーになります。
位置引数
argparseでは’-‘または’–-’で始まらない引数を位置引数と呼ぶ。
(普通はオプションとは言わない引数)
コマンドラインに指定した引数を表示させる。
import argparse
parser = argparse.ArgumentParser(description='Hello world program.')
parser.add_argument('name', metavar='NAME', nargs='?', action='store',default='ogi',
help='specify name instead "world".')
args = parser.parse_args()
if args.name:
print(args.name)
else:
print('エラー')
【引数追加箇所の説明】
- name・・・引数の名前(’-‘または’–’で始まらない引数)。これはあとで引数の値を参照するときの属性名になる。
- metavar=’NAME’・・・ヘルプメッセージの中で使う文字列。
- nargs=・・・・・(設定必須)
コマンドライン上で複数の引数を解析するのに1つの引数定義で設定できます。必須引数、もしくは期待される引数の数に基づいて次のフラグ値の1つを nargs にセットしてください。
設定は必須。設定しなければ引数0個の場合、エラーになる。
値 | 説明 |
---|---|
N | 引数の絶対数 (例 3) |
? | 0個 か 1個 の引数 |
* | 0個 か任意の引数 |
+ | 少なくとも1個以上の任意の引数 |
parser.add_argument(‘-foo’, nargs=3)
-foo には引数を3個設定しなければいけない。
(例)C:\Python33\test.py -foo 5 2 3
- default=’ogi’・・・・・引数が指定されなかった時に args.name に入る値。
- action=’store’・・・・・引数を属性にセットすることを指示している。
- help=~・・・・・ヘルプメッセージに表示する引数の説明。
7行目でコマンドライン引数をパースし、args変数に代入。args変数には指定した引数がname属性としてセットされていて、10行目で参照しています。
● コマンドライン
C:\Python33\test.py 12345
引数として「12345」を渡す。
parserインスタンス(オブジェクト)に add_argument メソッドより引数がセットされparse_args メソッドより解析を行ないます。
結果
12345
を表示。
オプション引数
’-’または’–’から始まる引数をオプション引数といいます。
オプション引数には値をとるオプションととらないオプションがあります。
値をとらないオプション
値をとらないオプションを作るには、action=’store_ture’ または action=’store_false’とする。
こうすると属性に値はセットされません。
▼(‘-m’または’–morning’オプションは、Helloの代わりにGood morningと表示する。)
import argparse
parser = argparse.ArgumentParser(description='Hello world program.')
parser.add_argument('name', metavar='NAME', nargs='?', action='store',
help='specify name instead "world".')
parser.add_argument('-m', '--morning', dest='morning', action='store_true',
help='good morning')
args = parser.parse_args()
if args.morning:
greeting = 'Good morning'
else:
greeting = 'Hello'
if args.name:
print('%s, %s.' % (greeting, args.name))
else:
print('%s, world.' % (greeting))
【6~7行目】
dest=’morning’はあとから参照するときの属性名を指定しています。
これを指定しないと長いオプション名から’–’を取り除いたものが属性名になるようです。
action=’store_true’は属性にTrueをセットすることを指示しています。
ちなみにaction=’store_false’とすることもできます。
14行目の条件分岐で用いる。
この「action」で値をとるオプション、値をとらないオプションが選択指定できます。
値をとるオプションの場合は action=’store’ となります。
● コマンドライン
C:\Python33\test.py
引数は渡していないので、表示は
Hello, world.
● コマンドライン
C:\Python33\test.py 123
引数「123」を渡しているので、表示は
Hello, 123.
● コマンドライン
C:\Python33\test.py -m 123
C:\Python33\test.py –morning 123
オプション「-m」または「–morning」を設定して、引数「123」を渡しているので表示はどちらも
Good morning, 123.
action=’store_true’、action=’store_false’ とする事でコマンドラインより -m オプションに値を指定することはできなくなります。
値をとるオプション
値をとるオプションを作るには、action=’store’とする。こうすると属性に値がセットされます。
import argparse
parser = argparse.ArgumentParser(description='Hello world program.')
parser.add_argument('name', metavar='NAME', nargs='?', action='store',
help='specify name instead "world".')
parser.add_argument('-m', '--morning', dest='morning', action='store_true',
help='good morning')
parser.add_argument('-t', '--times', dest='times', type=int, action='store', default=1,
metavar='N', help='repeat N times')
args = parser.parse_args()
if args.morning:
args.name = 'abe'
for n in range(args.times):
if args.name:
print('hello %s.' % args.name)
else:
print('hello world.')
type=’int’ は値が整数であるべきことを指示している。
default=1 は –times オプションが指定されなかったときのデフォルト値。
● コマンドライン
C:\Python33\test.py
引数はなし。
name も -m, -t のオプションの設定されていないが、-t オプションの default に「1」が設定されているのでargs.times には「1」が設定されるのでループは1回されてargs.name は値がないので表示は
hello world.
● コマンドライン
C:\Python33\test.py ono -m -t 3
位置引数の name には ono が指定されているが、-m オプション引数が設定されているのでargs.name には abe が設定される。
-t オプション引数には「3」が指定されているのでargs.times は「3」になり、ループは3回。
表示は
hello abe.
hello abe.
hello abe.
action=’store’ とする事でコマンドラインより -t オプションに値を指定することができます。
action=’store_const’(値をとらないオプション)
–mオプションの action を action=’store_const’ にすることで特定の値をセットするアクションが使えるようになります
import argparse
parser = argparse.ArgumentParser(description='Hello world program.')
parser.add_argument('name', metavar='NAME', nargs='?', action='store', default="world",
help='specify name instead "world".')
parser.add_argument('-m', '--morning', dest='greeting', action='store_const',
const='Good morning', default='Hello', help='good morning')
parser.add_argument('-t', '--times', dest='times', type=int, action='store', default=1,
metavar='N', help='repeat N times')
args = parser.parse_args()
for n in range(args.times):
print '%s, %s.' % (args.greeting, args.name)
action=’store_const’ とすると、constで指定した値がセットされます。
また、オプションが指定されなかった場合には default で指定されている値がセットされます。
ここでは const=’Good morning’、default=’Hello’としている。
● コマンドライン
C:\Python33\test.py abe
位置引数に abe を指定。
-m, -t 両オプションは設定されていないので、それぞれ default 値があてられる。
表示は
Hello, abe.
● コマンドライン
C:\Python33\test.py abe -m
位置引数に abe を指定。
-m オプションは設定されているが、コマンドラインからは値は指定できない。
が、action=’store_const’ となっているので const の ‘Good morning’ がargs.greeting に設定される。
-t オプションは設定されていないので、 default 値があてられる。
表示は
Good morning, abe.
引数の const, default に関数を指定
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))
オプション引数の const に ビルトイン関数の sum、default にビルトイン関数の max を指定。
● コマンドライン
C:\Python33\test.py 10 20 30
オプションは指定せずに、引数のみ。引数の「10, 20, 30」は、位置引数 integersへ。
▼実行結果
30
オプションは指定してないので、default の max関数が呼び出される。
max関数
list = [10,20,30]
print(max(list)) #---30を表示
● コマンドライン
C:\Python33\test.py 10 20 30 -sum
-sum オプションは指定。引数の「10, 20, 30」は、位置引数 integersへ。
▼実行結果
60
オプションは指定しているので、const の sum関数が呼び出される。
sum関数
list = [10,20,30]
print(sum(list)) #---60を表示
コマンドラインを解析
全ての引数を定義したら parse_args() へ引数文字列のシーケンスを渡すことでコマンドラインを解析します。
パーサー の parse_args() メソッドを呼び出すと、パーサーは sys.argv[1:] の解析をはじめます。
そして見つかったオプションを束ねた Values クラスインスタンスと引数のリストを返します。
import argparse
parser = argparse.ArgumentParser(description='Hello world program.')
parser.add_argument('name', metavar='NAME', nargs='?', action='store', default="world",
help='specify name instead "world".')
parser.add_argument('-m', '--morning', dest='greeting', action='store_const',
const='Good morning', default='Hello', help='good morning')
parser.add_argument('-t', '--times', dest='times', type=int, action='store', default=1,
metavar='N', help='repeat N times')
args = parser.parse_args()
print(args)
表示
Namespace(greeting=’Hello’, name=’world’, times=1)
サブコマンド
ArgumentParser.add_subparsers()を使うと、サブコマンドを定義できるようになります。
サブコマンドを作成するためには、パーサーをネストすることが必要です。
パーサーの中にまたパーサーを設けることでサブコマンドを設定できます。
import argparse
parser = argparse.ArgumentParser()
#---トップレベルのparserを作成-------------
parser.add_argument('--foo', dest='foo', action='store_true', help='foo help')
#---サブコマンドを登録するメソッドをもったオブジェクトを作成。----------
subparsers = parser.add_subparsers(help='sub-command help')
#---a というサブコマンドのparserを作成------------------
parser_a = subparsers.add_parser('a', help='a help')
#---引数を定義(位置引数)-----------------------------
parser_a.add_argument('aaa', type=int, help='aaa help')
#---b というサブコマンドのparserを作成------------------
parser_b = subparsers.add_parser('b', help='b help')
#---引数を定義(オプション引数)-------------------------------
parser_b.add_argument('--bbb', type=int, help='bbb help')
args = parser.parse_args()
print(args)
● コマンドライン
C:\Python33\test.py
▼実行結果
Namespace(foo=False)
● コマンドライン
C:\Python33\test.py a 10
▼実行結果
Namespace(aaa=10, foo=False)
● コマンドライン
C:\Python33\test.py b –bbb 10
サブコマンドでオプション引数に値を渡す時は「サブコマンドのparser(b)」「引数名(–bbb)」「値(10)」とする。
▼実行結果
Namespace(bbb=10, foo=False)
引数が設定された時に関数を実行させる
サブコマンドの foo がコマンドラインに設定された時に関数 foo_fun を実行する。
import argparse
def foo_fun(args):
print(args.ff)
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_foo = subparsers.add_parser('foo') #--fooという名のサブコマンド
parser_foo.add_argument('-f', dest='ff', type=int, default=1) #--サブコマンドに引数を設定
parser_foo.set_defaults(func=foo_fun) #--関数を実行させる設定
args = parser.parse_args()
args.func(args) #---
● コマンドライン
C:\Python33\test.py foo
foo は設定しているが、引数に値は設定されていないので default の 1 が参照される。
12行目で関数 foo_fun の実行が設定されているので、args.ff には 1 が参照される。
▼実行結果
1
● コマンドライン
C:\Python33\test.py foo -f 10
foo は設定し、オプション引数に 10 が設定されているので 10 が参照される。
12行目で関数 foo_fun の実行が設定されているので、args.ff には 10 が参照される。
▼実行結果
10
set_defaults関数
ほとんどの場合、 parse_args() が返すオブジェクトの属性はコマンドライン引数の内容と引数のアクションによってのみ決定されます。
set_defaults() を使うと与えられたコマンドライン引数の内容によらず追加の属性を決定することが可能です。
import argparse
def aaa(args):
print('aaa')
parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int, nargs='?')
parser.set_defaults(bar=42, baz='badger', func=aaa)
args = parser.parse_args()
print(args.foo)
print(args.bar)
print(args.baz)
args.func()
● コマンドライン
C:\Python33\test.py 736
▼実行結果
736
42
badger
aaa
パーサーレベルのデフォルト値は常に引数レベルのデフォルト値をオーバーライドします。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', default='bar', dest="foo")
parser.set_defaults(foo='spam')
args = parser.parse_args([])
print(args.foo)
● コマンドライン
C:\Python33\test.py
▼実行結果
spam
● サブパーサでなくてもOK
import argparse
def aaa(args):
print('aaa')
parser = argparse.ArgumentParser()
parser.add_argument('foo', type=int)
parser.set_defaults(func=aaa)
args = parser.parse_args()
args.func(args)
● コマンドライン
C:\Python33\test.py 10
▼実行結果
aaa