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は多機能なので分量は多いが、チュートリアルを最初から一回やってみるのが結局一番の近道。

Argparse チュートリアル — Python 3.6.6 ドキュメント

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

Last Updated: 6/26/2019, 10:34:03 PM