Python

コマンドラインで Python ファイルを実行する【 argparse モジュールについて 】

コマンドライン で Python を実行する

コマンドラインは ターミナルやパワーシェル、コマンドプロンプトのことです。

下記のコードを書いた python ファイルを 「test.py」の名前で仮想環境の直下に置きます。

print('ok')

この状態で下記のコードをターミナルで打つと、ターミナルでokと表示されます。

python test.py

階層を変更した場合

上記のように階層を変えた場合は次のようにして呼び出します。

python folder_A/test.py

仮想環境を作っていない場合は絶対パスを渡せば実行できます。

コマンドライン引数とは

今回はこのコマンドラインから Python を実行する際に引数を渡して実行する、という内容です。

python test.py args

といった形で引数を渡し、コード内で利用します。

sys.argv で引数を受け取る

コード内でsys.argv[]を書くことでコマンドラインからの引数を受け取れます。

import sys

file_name = sys.argv[0]
arg_01    = sys.argv[1]
arg_02    = sys.argv[2]

print('ファイル名 : ', file_name)
print('引数 1     : ', arg_01)
print('引数 2     : ', arg_02)

この状態でターミナル(コマンドライン)で下記のコードを打つと引数が出力されます。

python test.py あいうえお かきくけこ
ファイル名 :  test.py
引数 1     :  あいうえお
引数 2     :  かきくけこ

sys.argv[0]にはファイル名が入るので注意してください。

引数をオーバーしてもエラーは起きない

上記のコードでは第二引数までしか受け取っていません。

python test.py あいうえお かきくけこ さしすせそ

引数を3つ指定した場合でもエラーは起きません。
受け取っているわけでも出力しているわけでもないので結果は変わりません。

ファイル名 :  test.py
引数 1     :  あいうえお
引数 2     :  かきくけこ

ただエラーは起きない、というだけです。

文字列しか受け取れない

import sys

arg_01    = sys.argv[1]
arg_02    = sys.argv[2]

print(arg_01 + arg_02)

受け取った引数で計算を行ってみます。

python test.py 1 3

1 と 3 を渡した場合、結果は 13 と出てきます。

13

引数は文字列として扱われます。計算を行うには 型を変更します。

import sys

arg_01    = sys.argv[1]
arg_02    = sys.argv[2]

print(int(arg_01) + int(arg_02))
4

argparse モジュールの基本的な使い方

argparse は Python の標準モジュールです。
標準モジュールのためインストールは不要です。

インポートは下記のコード。

import argparse

argparse とは

sys.argv と argparse の違い

argpare モジュールを利用するとコマンドラインからの引数を扱いやすくすることができます。
具体的には下記のようなことができます。

  • コマンドラインから各引数のヘルプが見れる
  • 引数のタイプを指定できる
  • 必須の引数に指定できる
  • 渡せる引数を制限できる
  • 引数のデフォルト値を設定できる
  • ひとつの引数に与えられる数を指定できる

基本的な書き方

  1. パーサーを作る
  2. コマンドライン引数を設定
  3. コマンドライン引数の解析

の流れで書きます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# コマンドライン引数の設定
parser.add_argument('arg1')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg1)

コマンドラインの書き方はsys.argvのときと同じです。

python test.py あいうえお
あいうえお

コマンドラインからヘルプを表示

python test.py -h

上記のコードでヘルプを確認できるようになります。

positional arguments:
  arg1

optional arguments:
  -h, --help  show this help message and exit

指定が必須な引数

必ず指定する引数です。渡さない場合はエラーが発生します。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# コマンドライン引数の設定
parser.add_argument('positonal_arg_1')
parser.add_argument('positonal_arg_2')

# コマンドライン引数の解析
args = parser.parse_args()

parser.add_argumentに文字列をひとつ渡します。

ヘルプの表示

python test.py -h

ヘルプで確認します。

positional arguments:
  positonal_arg_1
  positonal_arg_2

optional arguments:
  -h, --help       show this help message and exit

必ず指定しなければならない引数は positional arguments に出力されます。

引数の解析・呼び出し・実行

引数の解析

# コマンドライン引数の解析
args = parser.parse_args()

上記のコードで引数を解析しますが、これがないとヘルプが表示されません。
変数 args に作成した引数を格納します。

この args を print 文で出力すると下記のように出てきます。

Namespace(positonal_arg_1='あいうえお', positonal_arg_2='かきくけこ')

「あいうえお」と「かきくけこ」はコマンドラインから渡したものです。
引数名をキーとしてコマンドラインから引数を受け取っています。

引数の呼び出し

args.作成した引数名

で受け取った引数を呼び出します。
ここまでのコードが下記です。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# コマンドライン引数の設定
parser.add_argument('positonal_arg_1')
parser.add_argument('positonal_arg_2')

# コマンドライン引数の解析
args = parser.parse_args()

# 引数を呼び出して出力
print(args.positonal_arg_1)
print(args.positonal_arg_2)

受け取った引数をそのまま表示させています。

コマンドラインから実行

python test.py あいうえお かきくけこ
あいうえお
かきくけこ

無事実行できます。

引数が足りない場合はエラーが発生します。

python test.py あいうえお
usage: test.py [-h] positonal_arg_1 positonal_arg_2 positonal_arg_3
test.py: error: the following arguments are required: positonal_arg_2, positonal_arg_3

指定が任意な引数

--で始まる引数を作ると指定しなくてもエラーが発生しない引数になります。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# コマンドライン引数の設定

# 指定が必須
parser.add_argument('positonal_arg_1')
parser.add_argument('positonal_arg_2')

# 指定が任意
parser.add_argument('--oprional_arg_1')
parser.add_argument('--oprional_arg_2')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.oprional_arg_1)
print(args.oprional_arg_2)

ショートコードの設定

オプショナル引数に関しては-を付けておくとショートコードとして設定できます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# コマンドライン引数の設定

# 指定が必須
parser.add_argument('positonal_arg_1')
parser.add_argument('positonal_arg_2')

# 指定が任意
parser.add_argument('--oprional_arg_1')

# ショートコードの設定
parser.add_argument('-oa_2', '--oprional_arg_2')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.oprional_arg_1)
print(args.oprional_arg_2)

ヘルプの表示

python test.py -h

usage: test.py [-h] [--oprional_arg_1 OPRIONAL_ARG_1] [-oa_2 OPRIONAL_ARG_2] positonal_arg_1 positonal_arg_2

positional arguments:
  positonal_arg_1
  positonal_arg_2

optional arguments:
  -h, --help            show this help message and exit
  --oprional_arg_1 OPRIONAL_ARG_1
  -oa_2 OPRIONAL_ARG_2, --oprional_arg_2 OPRIONAL_ARG_2

任意の引数は optional arguments に表示されます。
-h フラグは任意なのでここに表示されています。

コマンドラインから実行

python test.py test test --optional_arg_1 あいうえお -oa_2 かきくけこ

引数名の後に引数を渡します。
Positional argument は必須なので先に指定します。

あいうえお
かきくけこ 

argparse の引数にオプションを設定する

説明文を追加する | help

help='ヘルプ情報'で引数にヘルプ情報を作れます。

parser.add_argument('--arg_name', help='ヘルプ情報')
import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1', help='arg1 のヘルプ情報')
parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

これをヘルプで見ると下記のように出力されます。

python test.py -h

usage: test.py [-h] [--arg_1 ARG_1] [--arg_2 ARG_2]

optional arguments:
  -h, --help     show this help message and exit
  --arg_1 ARG_1  arg1 のヘルプ情報
  --arg_2 ARG_2  arg2 のヘルプ情報

引数を必須にする | required=True

required=Trueで optional argment を指定必須にすることができます。

parser.add_argument('--arg_name',  required=True)
import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1', 
                    required=True)

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

引数を設定せずに実行するとエラーが返ってきます。

python test.py

test.py: error: the following arguments are required: --arg_1

ただ、ヘルプで見ても positonal augument に入っているわけではありません。

python test.py -h

usage: test.py [-h] --arg_1 ARG_1 [--arg_2 ARG_2]

optional arguments:
  -h, --help     show this help message and exit
  --arg_1 ARG_1  arg1 のヘルプ情報
  --arg_2 ARG_2  arg2 のヘルプ情報

ヘルプで必須かどうかが わからなくなってしまいます。

デフォルト値を指定 | default

defaultで初期値を設定します。

parser.add_argument('--arg_name',  default='あいうえお')
import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    default='あいうえお')

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

python test.py

あいうえお

引数を指定しなくてもデフォルト値が出力されます。

指定必須にしてデフォルト値を設定

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    required=True,
                    default='あいうえお')

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

この状態で引数を指定せずに実行した場合、変わらずエラーが出ます。

python test.py

usage: test.py [-h] --arg_1 ARG_1 [--arg_2 ARG_2]
test.py: error: the following arguments are required: --arg_1

デフォルト値を設定した場合でも、指定必須にした場合はコマンドラインで引数と値を渡す必要があります。

python test.py --arg_1

usage: test.py [-h] --arg_1 ARG_1 [--arg_2 ARG_2]
test.py: error: argument --arg_1: expected one argument

引数だけ渡してもエラーが発生します。結局引数と値を渡す必要があります。

bool 値にする | action='store_true'

action='store_true'で指定すれば True 指定しなければ False の引数になります。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    action='store_true')

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

python test.py --arg_1

True

python test.py

False

引数の型を指定する | type

typeを指定することで受け取る型を指定できます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    type=int)

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1 + 2)

python test.py --arg_1 5

7

整数として受け取るため、そのまま計算に使用できます。

また、リストなども指定できます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    type=list)

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

python test.py --arg_1 5

['5']

受け取れる値を指定する | choices

choiccesを指定することで受け取れる引数を絞れます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    choices=['あいうえお', 'かきくけこ'])

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

python test.py --arg_1 あいうえお

あいうえお

指定したもの以外の値を受け取った場合はエラーになります。

python test.py --arg_1 さしすせそ

usage: test.py [-h] [--arg_1 {あいうえお,かきくけこ}] [--arg_2 ARG_2]
test.py: error: argument --arg_1: invalid choice: 'さしすせそ' (choose from 'あいうえお', 'かきくけこ')

受け取れる引数を増やす | nargs

nargs を指定することで受け取れる引数の数を増やせます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    nargs=2)

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

python test.py --arg_1 あいうえお かきくけこ

['あいうえお', 'かきくけこ']

複数ある場合はリストで出力されます。

python test.py --arg_1 あいうえお

usage: test.py [-h] [--arg_1 ARG_1 ARG_1] [--arg_2 ARG_2]
test.py: error: argument --arg_1: expected 2 arguments

指定した個数でない場合はエラーが発生します。

受け取れる個数を制限しない

nargs='*'あるいはnargs='+'を指定すると個数に制限を設けない設定にできます。

import argparse

# パーサーの作成
parser = argparse.ArgumentParser()

# 引数の作成
parser.add_argument('--arg_1',
                    nargs='*')

parser.add_argument('--arg_2', help='arg2 のヘルプ情報')

# コマンドライン引数の解析
args = parser.parse_args()

print(args.arg_1)

値が一つのみの場合でもリスト型で受け取ります。

python test.py --arg_1 あいうえお

['あいうえお']

値を何も渡さない場合は空のリストで受け取ります。

python test.py --arg_1

[]

引数を渡さない場合は None で受け取ります。

python test.py

None

-Python