Pythonでコマンドライン引数を扱う方法(sys.argv, argparse)
Pythonでコマンドライン引数を扱うには、sysモジュールのargv
かargparseモジュールを使う。sysもargparseも標準ライブラリに含まれているので追加のインストールは必要はない。
- 29.1. sys.argv --- システムパラメータと関数 — Python 3.6.6 ドキュメント
- 16.4. argparse --- コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.6.6 ドキュメント
sys.argv
は非常にシンプルで簡単に使えるが、引数の個数に応じた処理や型変換の処理を自分で行う必要がある。argparseは設定のためのコードが必要だが、オプションを使ったり任意の個数の引数を扱ったりできる。
決まった個数の引数に対して処理を行うのであればsys.argv
で十分だが、コマンドラインツールとして使うようなプログラムの場合はargparseを使ったほうが柔軟に引数を処理できるので便利。
以下、sys.argv
, argparseについてそれぞれ説明する。
プログラムの中でキーボードからの入力を取得したい場合はinput()
関数を使う。以下の記事を参照。
sys.argvでの引数処理
説明のため以下のスクリプトを用意する。
import sys
print('sys.argv : ', sys.argv)
print('type(sys.argv) : ', type(sys.argv))
print('len(sys.argv) : ', len(sys.argv))
print()
print('sys.argv[0] : ', sys.argv[0])
print('sys.argv[1] : ', sys.argv[1])
print('sys.argv[2] : ', sys.argv[2])
print('type(sys.argv[0]): ', type(sys.argv[0]))
print('type(sys.argv[1]): ', type(sys.argv[1]))
print('type(sys.argv[2]): ', type(sys.argv[2]))
引数を付けて実行する。引数はスクリプトファイルのパスの後ろにスペースで区切って指定する。
$ python3 sys_argv_test.py a 100
sys.argv : ['sys_argv_test.py', 'a', '100']
type(sys.argv) : <class 'list'>
len(sys.argv) : 3
sys.argv[0] : sys_argv_test.py
sys.argv[1] : a
sys.argv[2] : 100
type(sys.argv[0]): <class 'str'>
type(sys.argv[1]): <class 'str'>
type(sys.argv[2]): <class 'str'>
この結果から分かるように、sys.argv
は引数を以下のように扱う。
sys.argv
はリスト(list
)- リストなので要素数は
len()
で取得可能
- リストなので要素数は
- 一つ目の要素にスクリプトファイルのパスが格納される
- フルパスかファイル名のみかはOSによって異なる
- 要素の型は文字列(
str
)- 数値で指定しても文字列として格納される
- 数値に変換するには
int()
やfloat()
を使う
特に「要素の型は文字列(str
)」であることを忘れるとハマるので注意。数値として使いたい場合はint()
やfloat()
で変換するのを忘れない。
リストの要素数を取得するlen()
や、文字列を数値に変換するint()
, float()
については以下の記事を参照。
このサンプルコードのように引数の個数について特に考慮しない場合、想定よりも少ない引数しか指定されないとエラーになる。
$ python3 sys_argv_test.py a
sys.argv : ['sys_argv_test.py', 'a']
type(sys.argv) : <class 'list'>
len(sys.argv) : 2
sys.argv[0] : sys_argv_test.py
sys.argv[1] : a
Traceback (most recent call last):
File "sys_argv_test.py", line 11, in <module>
print('sys.argv[2] : ', sys.argv[2])
IndexError: list index out of range
引数の個数に応じて処理を変更したい場合は、len()
で要素数を取得して分岐させる必要がある。
argparseでの引数処理(型指定、複数引数のリスト化、オプション)
argparseモジュールを使うと、引数の型を指定したり、複数の引数をリストとして受け取ったり、(-i
や-o
のような)オプションを使えるようにしたりできる。
詳しい使い方の説明は公式のチュートリアルが充実しているのでそちらを参照されたい。argparseは多機能なので分量は多いが、チュートリアルを最初から一回やってみるのが結局一番の近道。
引数にブール値(True
, False
)を指定したい場合については注意が必要。以下の記事を参照。