JY-CONTENTS

JY

JY-CONTENTS
search

+

MENU

【Python】argparseモジュール

【Python】argparseモジュール

(DATE)

-

2016.12.13

(CATEGORY)

-

コマンドラインの引数を解釈するモジュール。
かなり膨大な機能持つモジュールらしいので基本的なところをざっくりと説明。
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行目で参照しています。

引数として「12345」を渡す。
parserインスタンス(オブジェクト)に add_argument メソッドより引数がセットされparse_args メソッドより解析を行ないます。

を表示。

オプション引数

’-’または’–’から始まる引数をオプション引数といいます。
オプション引数には値をとるオプションととらないオプションがあります。

値をとらないオプション

値をとらないオプションを作るには、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))

dest=’morning’はあとから参照するときの属性名を指定しています。
これを指定しないと長いオプション名から’–’を取り除いたものが属性名になるようです。
action=’store_true’は属性にTrueをセットすることを指示しています。
ちなみにaction=’store_false’とすることもできます。
14行目の条件分岐で用いる。
この「action」で値をとるオプション、値をとらないオプションが選択指定できます。
値をとるオプションの場合は action=’store’ となります。

引数は渡していないので、表示は

引数「123」を渡しているので、表示は

オプション「-m」または「–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 オプションが指定されなかったときのデフォルト値。

引数はなし。
name も -m, -t のオプションの設定されていないが、-t オプションの default に「1」が設定されているのでargs.times には「1」が設定されるのでループは1回されてargs.name は値がないので表示は

位置引数の name には ono が指定されているが、-m オプション引数が設定されているのでargs.name には abe が設定される。
-t オプション引数には「3」が指定されているのでargs.times は「3」になり、ループは3回。
表示は

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’としている。

位置引数に abe を指定。
-m, -t 両オプションは設定されていないので、それぞれ default 値があてられる。
表示は

位置引数に abe を指定。
-m オプションは設定されているが、コマンドラインからは値は指定できない。
が、action=’store_const’ となっているので const の ‘Good morning’ がargs.greeting に設定される。
-t オプションは設定されていないので、 default 値があてられる。
表示は

引数の 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 を指定。

オプションは指定せずに、引数のみ。引数の「10, 20, 30」は、位置引数 integersへ。

▼実行結果

オプションは指定してないので、default の max関数が呼び出される。

list = [10,20,30]
print(max(list))   #---30を表示

-sum オプションは指定。引数の「10, 20, 30」は、位置引数 integersへ。

▼実行結果

オプションは指定しているので、const の 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)

表示

サブコマンド

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)

▼実行結果

▼実行結果

サブコマンドでオプション引数に値を渡す時は「サブコマンドのparser(b)」「引数名(–bbb)」「値(10)」とする。

▼実行結果

引数が設定された時に関数を実行させる

サブコマンドの 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)  #---

foo は設定しているが、引数に値は設定されていないので default の 1 が参照される。
12行目で関数 foo_fun の実行が設定されているので、args.ff には 1 が参照される。

▼実行結果

foo は設定し、オプション引数に 10 が設定されているので 10 が参照される。
12行目で関数 foo_fun の実行が設定されているので、args.ff には 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()

▼実行結果

パーサーレベルのデフォルト値は常に引数レベルのデフォルト値をオーバーライドします。

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)

▼実行結果

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)

▼実行結果

NEW TOPICS

/ ニュー & アップデート

SEE ALSO

/ 似た記事を見る

JY CONTENTS UNIQUE BLOG

search-menu search-menu