技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

Pythonでコマンドライン引数を渡す方法3種類

Pythonコマンドライン引数を渡す方法は知る限り下記の3種類ある。
1. sys.argv
2. argparser
3. docopt

このうち、主に上の2つを紹介する。

sys.argv

最も簡単な方法。
コマンドラインの引数を配列のようにして扱う。

sample

import sys

print('script name : %s'%sys.argv[0])
print(sys.argv[1])
$ python parsers.py hello
script name : parsers.py
hello

使い方

sys.argsに配列としてコマンドライン引数が入っている。0番目はプログラムの名前に当たるので、1番目以降を引数として使うことになる。

argparser

sys.argvでは引数の個数も決めておかないといけないし順番もバラバラではいけない。
使い方がわからなくなったとしたら、ソースを読むしかない。
これに対してargparserではシェルのコマンドのように"--help"や"-h"を引数にすることでヘルプを表示させることができる。
また、引数の順番関係なくオプション指定で引数を渡すことができる(`-i hello -m 10`と`-m 10 -i hello`は同じ意味になる)
人に使ってもらうようなプログラムや大規模なプログラムを書くときはargparserを使うのが一番良いと思う。

sample

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)')
parser.add_argument('--display',action='store_true')

args = parser.parse_args()
if(args.display):
    print('result :')
print(args.accumulate(args.integers))
$ python parsers.py 1 2 3 --display
result :
3

$ python parsers.py 1 2 3 --sum
6

$ python parsers.py -h
usage: parsers.py [-h] [--sum] [--display] N [N ...]

Process some integers.

positional arguments:
  N           an integer for the accumulator

optional arguments:
  -h, --help  show this help message and exit
  --sum       sum the integers (default: find the max)
  --display

使い方

大まかな使い方としては
1.パーサーを作る
2.引数を追加する
3.引数を解析する
という順番になっている。
詳しくは下のリンク先を見てもらうとして、
引数を追加するadd_parser()の引数だけ示しておく。

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

docopt

コメントにMarkdownドキュメントっぽく使い方を書いておけばそれをもとにオプション引数を作ってくれるという優れもの。
僕自身まだあまり馴染みがなく偉そうな事は書けないので、解説は下のリンクに譲る。
Pythonのdocopt使い方メモ - Qiita
Pythonのコマンドライン引数処理の決定版 docopt (あとJuliaに移植したよ) - りんごがでている