Pythonでコマンドライン引数を扱う方法(sys.argv, argparse)

Modified: | Tags: Python

Pythonでコマンドライン引数を扱うには、sysモジュールのargvかargparseモジュールを使う。sysも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]))

python(またはpython3)コマンドで引数を付けて実行した結果は以下の通り。引数はスクリプトファイルのパスの後ろにスペースで区切って指定する。

$ 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()で取得してif文で条件分岐させるか、例外処理を行う。

argparseでコマンドライン引数処理

argparseモジュールを使うと、引数の型を指定したり、複数の引数をリストとして受け取ったり、(-i-oのような)オプションを使えるようにしたりできる。

詳しい使い方の説明は公式のチュートリアルが充実しているのでそちらを参照されたい。argparseは多機能なので分量は多いが、チュートリアルを最初から一回やってみるのが結局一番の近道。

引数にブール値(True, False)を指定したい場合については注意が必要。以下の記事を参照。

関連カテゴリー

関連記事