Pythonでコマンドライン引数を渡す方法

Pythonでコマンドライン引数を渡す方法をご紹介します。

条件

  • Python 3.7.0

sys.argvを用いる方法

sys.argvを用いる場合は非常に簡単です。
以下にサンプルプログラムを示します。

サンプルプログラム

# argvTest.py

import sys

print('=== コマンドライン引数 ===')

args = sys.argv

print('■引数リスト')
print(args)

print('■引数個別')
print(args[0])
print(args[1])
print(args[2])

実行結果1

>python argvTest.py test1 test2
=== コマンドライン引数 ===
■引数リスト
['argvTest.py', 'test1', 'test2']
■引数個別
argvTest.py
test1
test2

実行プログラムの後にスペースを空けて文字列を渡せばOKです。
引数リストの1つ目が「実行ファイル名」になるところがポイントです。

実行結果2

>python argvTest.py test1
=== コマンドライン引数 ===
■引数リスト
['argvTest.py', 'test1']
■引数個別
argvTest.py
test1
Traceback (most recent call last):
  File "argvTest.py", line 13, in <module>
    print(args[2])
IndexError: list index out of range

渡す引数の数が、プログラム内でアクセスするリストサイズより小さいとエラーになります。

sys.argvを用いたコマンドライン引数取得は簡単ですが、引数取得後にプログラム内で各種エラー処理が必要になります。

argparseを用いる方法

argparseを用いることで、「プログラムhelpの表示」や「引数の各種チェック」などを行うことができます。
実運用で使用するプログラムは「argparse」を用いた実装を行う方が無難です。

以下にサンプルプログラムを示します。

以下のような処理を行うプログラムです。

  • 何も引数を渡さない場合:デフォルトモードで動作
  • 引数に日時(YYYY/MM/DD)を渡す場合:特定モードで動作

サンプルプログラム

# argparseTest.py

import argparse
from datetime import datetime as dt, timedelta


## コマンドライン引数を受け取る関数
def get_args():
    
    parser = argparse.ArgumentParser(
        description='Set the target date if you want to regist specific date data.')

    parser.add_argument('--target', metavar='YYYY/MM/DD', type=str,
                        help='Target date to regist specific date data.')

    args = parser.parse_args()
    return(args)


## main関数
def main():

    args = get_args() # コマンドライン引数を取得

    if getattr(args, 'target'): # 'target'に値が渡されているか確認
        
        print('Processing specfic mode.')
        print('target args = ' + args.target)
        target_datetime = dt.strptime(args.target, '%Y/%m/%d')
        print(target_datetime)
    else:
        
        print('Processing default mode.')


## main関数を実行
if __name__ == '__main__':
    main()

実行結果(引数なし)

>argparseTest.py
Processing default mode.

実行結果(引数あり)

>argparseTest.py --target 2018/12/14
Processing specific mode.
target args = 2018/12/14
2018-12-14 00:00:00

実行結果(引数不足)

>argparseTest.py --target
usage: argparseTest.py [-h] [--target YYYY/MM/DD]
argparseTest.py: error: argument --target: expected one argument

実行結果(余計な引数あり)

>argparseTest.py --target 2018/12/14 aa
usage: argparseTest.py [-h] [--target YYYY/MM/DD]
argparseTest.py: error: unrecognized arguments: aa

実行結果(help表示)

>argparseTest.py -h
usage: argparseTest.py [-h] [--target YYYY/MM/DD]

Set the target date if you want to regist specific date data.

optional arguments:
  -h, --help           show this help message and exit
  --target YYYY/MM/DD  Target date to regist specific date data.
>argparseTest.py --help
usage: argparseTest.py [-h] [--target YYYY/MM/DD]

Set the target date if you want to regist specific date data.

optional arguments:
  -h, --help           show this help message and exit
  --target YYYY/MM/DD  Target date to regist specific date data.

プログラム作成に数行の手間はかかりますが、上記のように引数チェックやhelp表示も出来て便利です。
argparseは他にも様々な設定項目がありますので、詳細は公式ドキュメントをご参照ください。

参考

Python公式:システムパラメータと関数

https://docs.python.org/ja/3/library/sys.html#sys.argv

Python公式:argparse — コマンドラインオプション、引数、サブコマンドのパーサー

https://docs.python.org/ja/3/library/argparse.html#module-argparse

コメントを残す

メールアドレスが公開されることはありません。