note.nkmk.me

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

Date: 2018-08-25 / tags: Python

Pythonでコマンドライン引数を扱うには、sysモジュールのargvかargparseモジュールを使う。sysもargparseも標準ライブラリに含まれているので追加のインストールは必要はない。

sys.argvは非常にシンプルで簡単に使えるが、引数の個数に応じた処理や型変換の処理を自分で行う必要がある。argparseは設定のためのコードが必要だが、オプションを使ったり任意の個数の引数を扱ったりできる。

決まった個数の引数に対して処理を行うのであればsys.argvで十分だが、コマンドラインツールとして使うようなプログラムの場合はargparseを使ったほうが柔軟に引数を処理できるので便利。

以下、sys.argv, argparseについてそれぞれ説明する。

スポンサーリンク

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)を指定したい場合については注意が必要。以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事