よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【argparse】コマンドライン引数でメニュー/呼び出す関数の選択

コマンドライン引数を設定する標準ライブラリargparseを初めて使ってみる。
オプションから関数が呼び出せるか試してみるテスト。



【実行環境】
Termux
Python3.9



コマンドライン引数を使う最も簡単な方法は、標準ライブラリsysを使ってsys.argvで取得するものだろうか。入門書には必ずこれが最初に出てくる。
簡単な使用例を。



sys.argv


test_sys_argv.py

# ライブラリのインポート
import  sys

# 関数の定義(コマンドライン引数の表示)                                                                        def printArgs():
    print(sys.argv)

# 実行
printArgs()

上記のファイルをターミナルで実行する。

$ python test_sys_argv.py hahaha lol warota
['test_sys_argv.py', 'hahaha', 'lol', 'warota'
]

引数の要素の一番目はそのファイル自身、そしてその他の引数が続く。リスト形式で戻る。



argparse


今度は、標準ライブラリargparseを使う。色んな細かい設定ができるようですが、こちらも簡単に触れる。
test_argparse.py

# ライブラリのインポート
import argparse

# 
parser = argparse.ArgumentParser()

# コマンドライン引数を追加する
## int型の引数x
parser.add_argument("x", type=int, help="引数1を入力ください")

# int型の引数y
parser.add_argument("y", type=int, help="引数2を入力ください")

# true/falseを返すオプション引数
## 関数呼び出し用
parser.add_argument("--menu1", action="store_true", help="引数x+yの算出")

# true/falseを返すオプション引数
## 関数呼び出し用
parser.add_argument("--menu2", action="store_true", help="引数x-yの算出")

args = parser.parse_args()


# 入力されたコマンドライン引数の表示
print("x :",args.x)
print("y :",args.y)
print("munu1 :",args.menu1)
print("munu2 :",args.menu2)


# オプションで呼び出す関数定義
def plus(x, y):
    print(f"{x} + {y} = ",x + y)

def minus(x, y):
    print(f"{x} - {y} = ",x - y)

# オプションで呼び出された時のアクション
if args.menu1:
plus(args.x, args.y)

if args.menu2:
minus(args.x, args.y)
  • 引数xyを与えると、それぞれargs.xargs.yで取得できる。

  • xyのどちらか一方でも抜けるとが自動的に表示される。

  • オプション引数で--menu1--menu2を追加することで、引数xyを使った関数を呼び出して計算結果を表示する。

  • オプション引数の-h--helpでヘルプの表示



オプション引数--help

$ python test_argparse.py -h
usage: testArgparse.py [-h] [--menu1]
                       [--menu2]
                       x y

positional arguments:
  x           引数1を入力ください               y           引数2を入力ください

optional arguments:
  -h, --help  show this help message and
              exit
  --menu1     引数x+yの算出                     --menu2     引数x-yの算



引数が欠如した場合

$ python test_argparse.py 5
usage: testArgparse.py [-h] [--menu1]
                       [--menu2]
                       x y
testArgparse.py: error: the following arguments are required: y

shell returned 2

int型引数を1つしか入力しなかった為に使用法と注意が出た。



ちゃんと引数を2つ入力した場合

$ python test_argparse.py 5 7
x : 5
y : 7
munu1 : False
munu2 : False

オプション引数は入力していないので共にFalseになっている。



オプション引数を1つ入力

$ python test_argparse.py 5 7 --menu1
x : 5
y : 7
munu1 : True
munu2 : False
5 + 7 =  12

menu1のオプションを入力したのでそこだけTrueになり、足し算用の関数が呼び出されて計算結果が表示されている。メニューとして使えるね。



オプション引数を2つ同時入力

$ python test_argparse.py 5 7 --menu1 --menu2
x : 5
y : 7
munu1 : True
munu2 : True
5 + 7 =  12
5 - 7 =  -2

オプションをオンにした両方の計算結果が表示された。スクリプトの関数呼び出し部分で、2つともifにしている。ifelseelifにすると同時には表示されなかった。
両方ifで。

--menu2のみは省略する。引き算だけが表示される。



参考リンク




おわりに

コマンドライン引数を扱う際に、標準ライブラリのsysargparseを使う以外に外部ライブラリでclickfire等があるとのことで、先にfireをインストールしてみたのですが、便利なのかどうかがわからなかった。ので今回argparseを触ってみた次第でした。



以上です。