Python_コマンドライン引数

コマンドライン引数の取得

コマンドライン引数を取得するには、sys.argvを利用します。

引数は指定順に配列に格納されています。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys


def main(args):
    # 引数の指定数を確認する。
    if len(args) < 2:
        print('Usage: # python %s args ... ' % args[0])
        sys.exit(-1)

    # 引数は配列として格納されます。
    print(args)

    # 引数の指定数を表示する。
    print("argc : %d" % len(args))

    # 各引数を表示する。
    for idx, arg in enumerate(args):
        print("arg{0} : {1}".format(idx, arg))

    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))

argparseでオプション解析を行う。

argparseはpython標準ライブラリに用意されているCLIツールです。

コマンドラインの引数を解釈し、usageやエラーメッセージを自動的に作成します。


最小構成

argparseモジュールをimportして、メソッドを呼び出すだけでusageを作成することができます。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.parse_args()

    return 0


if __name__ == "__main__":
    sys.exit(main())

これを「-h」または「--help」を付けて実行すると以下のようにusageが表示されます。


$ ./arg_test.py -h
usage: arg_test.py [-h]

optional arguments:
  -h, --help  show this help message and exit

位置引数

パラメータを位置引数(ポジショナル引数, Positional Arguments)で指定する場合、「-」なしでオプション定義します。

コマンドライン引数の数やtypeに合わせた型チェックを自動的に行うことが可能です。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("filename", help="target filename", type=str)
    parser.add_argument("line", help="number of lines", type=int)
    args = parser.parse_args()

    print("filename=" + args.filename)
    print("line = %d" % args.line)

    return 0


if __name__ == "__main__":
    sys.exit(main())

オプショナル引数

「-」を付けたオプション定義をすると、オプショナル引数(Optional Arguments)となります。

オプショナル引数は任意のパラメータを取得することができます。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-f", help="target filename", type=str)
    parser.add_argument("--line", help="number of lines", type=int)
    parser.add_argument("-v", help="verbose mode", action="store_true")
    args = parser.parse_args()

    if args.f is not None: print("filename=" + args.f)
    if args.line is not None: print("line = %d" % args.line)
    if args.v: print("Verbose mode")

    return 0


if __name__ == "__main__":
    sys.exit(main())

詳細設定

argumentParserクラスのコンストラクタの引数やadd_argumentメソッドの引数を設定することで、オプションの扱い方を細かく設定できます。


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

import sys
import argparse


def main():
    parser = argparse.ArgumentParser(
        prog='arg_test.py',  # プログラム名
        usage='Demonstration of argparser',  # プログラムの利用方法
        description='description',  # 引数のヘルプの前に表示
        epilog='epilog',  # 引数のヘルプの後で表示
    )
    parser.add_argument(
        "-f",  # オプション引数
        help="target filename",  # helpメッセージ
        type=argparse.FileType('r'),  # ファイルの存在チェックも行う
        default="default.conf",  # 引数がなかった場合に生成される値
        required=False  # 引数の省略可否
    )
    parser.add_argument(
        "subcmd",  #位置引数
        help="This is sub command",  # helpメッセージ
        metavar="on | off",  # メッセージで表示される引数の名前
        choices=["on", "off"],  # 引数として許される値の指定
        type=str  # 引数の型
    )
    args = parser.parse_args()

    print(args.f)
    print(args.subcmd)

    return 0


if __name__ == "__main__":
    sys.exit(main())


関連ページ