simudaru's blog

Python, Rなどのメモを残していこうと思います。  よろしくお願いいたします。

argparseを試してみました

argparseを試してみました。
とりあえずは基本的なものだけ。

使い方としては、

  1. ArgumentParserを作る
  2. 引数を追加する
  3. パースする

という手順になります。

# coding: utf-8

# [!]引数を取るので、sysのimportは必須
import sys
import argparse

# まずはArgumentParserを作る
parser = argparse.ArgumentParser(description='argparseの使い方のサンプルとして、A+Bを出力するコードを作る',
                                 formatter_class=argparse.ArgumentDefaultsHelpFormatter
                                 )

# 引数を追加していく
parser.add_argument('A', type=int, help='integer')
parser.add_argument('B', type=int, help='integer')
parser.add_argument('output', nargs='?', type=argparse.FileType('w'), default=sys.stdout, 
                    help='output file.')

# パースする
args = parser.parse_args()

# 処理を行う
args.output.write(str(args.A + args.B))
args.output.write('\n')


add_argumentで引数を追加できます。
typeで指定した型で引数を取ることができます。

parser.add_argument('B', type=int, help='integer')


nargsで、その引数が使う引数の数を指定できます。
nargs='?'とすると、可能なら1つの引数がコマンドラインから取られ、引数がなければdefaultを取ります。
以下はマニュアルにもある、outputをfileにも標準出力にもできるような指定方法の例です。

parser.add_argument('output', nargs='?', type=argparse.FileType('w'), default=sys.stdout, 
                    help='output file.')


もう一つ例を。

# coding: utf-8

# [!]引数を取るので、sysのimportは必須
import sys
import argparse

# まずはArgumentParserを作る
parser = argparse.ArgumentParser(description='argparseの使い方のサンプルとして、与えられた整数値を計算して出力するコードを作る',
                                 prog='PROG')

# 引数を追加していく
parser.add_argument('accumulate', choices=['sum', 'min', 'max', 'mean', 'sd'],
                    help="you can select function in ['sum', 'min', 'max', 'mean', 'sd'].")
parser.add_argument('input', nargs='?', type=argparse.FileType('r'), default=sys.stdin, 
                    help='[default: stdin] input file.')
parser.add_argument('output', nargs='?', type=argparse.FileType('w'), default=sys.stdout, 
                    help='[default: stdout] output file.')
parser.add_argument('--pow', dest='pow_n', type=float, help='値をn乗してから計算する')

# パースする
args = parser.parse_args()

# 処理を行う
line = args.input.read()
x = line.rstrip().split()
x = [int(it) for it in x]

if args.pow_n:
    x = [pow(it, args.pow_n) for it in x]

if args.accumulate == 'sum':
    retval = sum(x)
elif args.accumulate == 'min':
    retval = min(x)
elif args.accumulate == 'max':
    retval = max(x)
elif args.accumulate == 'mean':
    retval = 1.0 * sum(x) / len(x)
elif args.accumulate == 'sd':
    if len(x) == 1: retval = None
    tmp = sum([pow(it, 2) for it in x])
    retval = 1.0 * (tmp - pow(1.0 * sum(x), 2) / len(x)) / (len(x) - 1)
else:
    assert()

args.output.write(str(retval))
args.output.write('\n')


choicesを使うと、指定した値以外の値を取れないようにできます。

parser.add_argument('accumulate', choices=['sum', 'min', 'max', 'mean', 'sd'],
                    help="you can select function in ['sum', 'min', 'max', 'mean', 'sd'].")


とりあえずはこの程度が使えれば良いのではないかと思います。