[Python] ArgumentParser でコマンドライン引数を解析する

[Python] ArgumentParser でコマンドライン引数を解析する

ArgumentParser でコマンドライン引数を解析する

argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.9.1 ドキュメント

Python でコマンドライン引数を使ったプログラムを作成する場合、標準ライブラリとして提供される argparse モジュール を使用すると便利です。

例えば cat コマンドでファイル内容を出力するとき、コマンドライン引数で -n or --number を付けてやると、以下のように行番号も一緒に表示してくれます。

$ cat a.txt -n
     1  hello
     2  world

この時の引数 a.txt-n, --number をいい感じに解析してくれるモジュールが argparse です。もちろん sys.argv を自前で解析するプログラムを書くこともできますが、いろいろな条件を考慮して処理を書くと大変になるので argparse モジュールを使うと便利です。

標準ライブラリなのですぐに使うことができます。

使い方

使い方は簡単でモジュールをインポートし、パーサーに対して使用する引数を条件を指定しながら追加していくだけです。最後にパースを実行すれば指定した条件で解析してくれます。

import argparse

# パーサーの生成
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')

# 必須引数
parser.add_argument('value', type=str, help='文字列の必須引数です。')

# オプション引数(省略可能)
parser.add_argument('-o', '--option', help='ハイフン始まりの引数は省略可能です。')

# コマンド引数解析実行
ns = parser.parse_args()

# 確認
print(ns)

上記コード a.py 問う名前のファイルとして保存し、コマンド引数を指定してを実行します。

$ python a.py hoge --option=123
Namespace(option='123', value='hoge')

コマンド引数がパースされて Namespace(option='123', value='hoge') という形で確認できました。

コマンド引数なしで実行するとエラーになることが確認できます。

$ python a.py
usage: a.py [-h] [-o OPTION] value
a.py: error: the following arguments are required: value

コマンドの使い方の説明も自動で生成してくれてどのような引数が指定できるか確認できます。実は自動でヘルプも生成してくれるので -h でヘルプも見れます。

$ python a.py -h
usage: a.py [-h] [-o OPTION] value

ここにコマンドの説明を書きます。

positional arguments:
  value                 文字列の必須引数です。

optional arguments:
  -h, --help            show this help message and exit
  -o OPTION, --option OPTION
                        ハイフン始まりの引数は省略可能です。

便利ですね。

parser.parse_args() は引数を指定しないとコマンド引数を解析しますが、配列を渡すとその値を使って解析してくれます。

よくある使い方

必須引数とオプション引数以外にもいろいろパラメータを指定できます。以下よくある使い方をまとめます。

型を指定する type

type に型を指定することで解析時に引数の型を合わせてチェックします。失敗すればエラーになります。

import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')

# str, int, float 
parser.add_argument('str', type=str, help='文字列の必須引数です。')
parser.add_argument('int', type=int, help='整数値の必須引数です。')
parser.add_argument('float', type=float, help='小数値の必須引数です。')

# Namespace(float=3.14, int=100, str='string')
ns = parser.parse_args(['string', '100', '3.14'])
print(ns)

複数の値をリストで取得する nargs

import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')

# 可変長の引数
parser.add_argument('--values', type=int, nargs='*')
# 固定長の引数
parser.add_argument('--pair', nargs=2, help='2個の整数値を受け取ります。')

# Namespace(pair=['x', 'y'], values=[1, 2, 3])
ns = parser.parse_args('--values 1 2 3 --pair x y'.split())
print(ns)

# Namespace(pair=None, values=[])
ns = parser.parse_args('--values'.split())
print(ns)

# ns = parser.parse_args('--pair'.split()) 
# : error: argument --pair: expected 2 arguments

オプション引数の場合、nargs で引数で受け取る個数を指定できます。受け取った値は指定された型のリストとして保持されます。

nargs='*' とすることで可変長の引数として受け取れます。1件だけの指定でもリストとして解析されます。

あくまでオプション引数なので、指定しない場合は None になります。可変長引数の場合は値なしで空リストになりますが、固定長の場合はエラーになります。

引数があるかどうかフラグとして扱う

import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')

# 可変長の引数
parser.add_argument('--flag', action='store_true')

# Namespace(flag=True)
ns = parser.parse_args('--flag'.split())
print(ns)

# Namespace(flag=False)
ns = parser.parse_args(''.split())
print(ns)

--flag という引数が指定されていれば True 指定されてなければ False になるような、フラグとして扱いたいときには action='store_true' と指定するとよいです。

parse_args の結果を Namespace ではなく辞書型で取得する

Namespace ではなく辞書型のほうが扱いやすい場合は vars() を使えば辞書に変換できます。

import argparse

# パーサーの生成
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
parser.add_argument('value', type=str, help='文字列の必須引数です。')
parser.add_argument('-o', '--option', help='ハイフン始まりの引数は省略可能です。')
ns = parser.parse_args('a -o=123'.split())

# Namespace を辞書にする
dic = vars(ns)

# 確認
print(dic)

# {'value': 'a', 'option': '123'}

参考URL

argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.9.1 ドキュメント

Pythonカテゴリの最新記事