読者です 読者をやめる 読者になる 読者になる

Flat Leon Works

アプリやゲームを作ってます。

【Python】コマンドライン引数を解析する(argparseの利用)

Python2.7を対象とします。

コマンドライン引数の解析

コマンドライン引数の解析とは、Pythonスクリプト起動時に渡されたパラメータを解析することです。起動時に渡されたパラメータは'sys.argv'で取得できますが、パラメータの意味の解析やエラーチェックなどは自分で行う必要があります。そのへんを便利にしてくれるのがPythonの標準ライブラリであるargparseです。

argparseの便利なところ

  • 自動でhelpオプション(-h --help)を生成してくれる
  • 不正なパラメータを検知してエラーを出してくれる
  • 位置引数とオプション引数の両方が扱える
  • オプション引数に別名を設定できる( -f--fooなど )
  • その他いろいろ!

argparseを利用する

argparseの利用手順

  • 1.ArgumentParserオブジェクトを生成する
  • 2.ArgumentParserオブジェクトにパラメータ(引数)を追加していく
  • 3.ArgumentParserオブジェクトを使って起動パラメータを解析する
  • 4.解析結果を利用する
# 1.ArgumentParserオブジェクトを生成する
parser = argparse.ArgumentParser(description='MyScript')

# 2.ArgumentParserオブジェクトにパラメータ(引数)を追加していく 
parser.add_argument('inputFile', help='Input file path')
parser.add_argument('--outputFile', help='Output file path')

# 3.ArgumentParserオブジェクトを使って起動パラメータを解析する
args = parser.parse_args()

# 4.解析結果を利用する
fileData = open( args.inputFile, 'r' ).read()

メソッドなどの詳細は公式ドキュメントをご覧ください。

逆引きリファレンス

コマンドライン引数を指定して解析する

parse_argsメソッドにリストを渡すことで、コマンドライン引数を指定することができます。スクリプトの動作確認などに便利です。

args = parser.parse_args(['aaa.txt', '--outputFile', 'bbb.txt'])

ドキュメント : parse_args() メソッド

位置引数を追加する

parser.add_argument('inputFile', help='Input file path')

add_argumentメソッドに渡した名前の最初の文字が-でない場合は位置引数になります。位置引数はプログラムの必須のパラメータになるので、パラメータとして渡されなかった場合はエラーが発生します。(ただし、nargsで '?' か '*' を指定し、さらにdefault値を設定した場合は省略可能)

ドキュメント : add_argument() name-or-flags

オプション引数を追加する

parser.add_argument('--outputFile', help='Output file path')

add_argumentメソッドに渡した名前の最初の文字が-の場合はオプション引数になります。オプション引数は省略可能なパラメータです。(省略不可にすることも可能)

ドキュメント : add_argument() name-or-flags

オプション引数にデフォルト値を設定する

add_argumentメソッドのdefault引数を使うことでデフォルト値を設定できます。

parser.add_argument('--foo', default=42)

ドキュメント : add_argument() default

引数を文字列以外で受け取る(変換を行う)

add_argumentメソッドのtype引数を使うことで文字列以外の型として受け取ることができます。実際には文字列から別の型への変換が行われます。

parser.add_argument('foo', type=int) # 引数をintとして受け取る

typeにはPython組み込み型の他、関数を指定することもできます。

ドキュメント : add_argument() type

引数をユニコード文字列で受け取る(変換を行う)

def utf8_to_unicode( string ):
    return unicode( string, 'utf_8' )
parser.add_argument('foo', type=utf8_to_unicode)

変換関数を定義してtype引数に渡しています。

ドキュメント : add_argument() type

オプション引数をフラグとして設定する

add_argumentメソッドのaction引数とconst引数を使うことでオプション引数をフラグとして設定することができます。

parser.add_argument('--debug', '-d', action='store_const', const=True, default=False )
args = parser.parse_args()

if args.debug:
  print 'Debug mode'

引数に --debug or -d があった場合、'args.debug' は True になります。

以下のような書き方もできるようです。

parser.add_argument('--debug', '-d', action='store_true' )

ドキュメント : add_argument() action

引数の個数を指定する

add_argumentメソッドのnargs引数を利用することで引数の個数(続く引数の消費数)を指定することができます。

N(整数)N個の引数を取りリストに格納される。Nが1でもリストに格納されることに注意。
?1個の引数を取る。引数が取れなかった場合はconst値になる。引数自体が存在しない場合はdefault値になる。
*複数の引数を取りリストに格納される。引数自体が存在しない場合はdefault値になる。
+複数の引数を取りリストに格納される。最低でも1つは必要。
argparse.REMAINDER残りの引数すべてを取りリストに格納される。
(nargs指定なし)action引数によって決まる。通常は1つのアイテムになる。

ドキュメント : add_argument() nargs

引数を複数回指定可能にする

add_argumentメソッドのaction引数に append を指定することで引数を複数回指定可能になります。

parser.add_argument('--foo', action='append')
args = parser.parse_args('--foo 1 --foo 2'.split())
args.foo # ['1', '2']

複数指定された引数はリストに格納されます。

nargs='*' と併用した場合、リストのリストにはならず、単一のリストになるようです。

ドキュメント : add_argument() action

オプション引数を必須にする

add_argumentメソッドのrequired引数を利用することでオプション引数を必須にすることができます。

parser.add_argument('--foo', required=True)

ドキュメント : add_argument() required

引数の内容を限定する

add_argumentメソッドのchoices引数を利用することで引数の内容を限定することができます。指定以外のものが渡された場合はエラーになります。

parser.add_argument('move', choices=['rock', 'paper', 'scissors'])

ドキュメント : add_argument() choices