この記事にはプロモーションが含まれています。
pythonでプログラミングをしていて、
- ファイル名の引数を後から自由に変えたい
- 変数を外部から操作できるようにしたい
と思うことはないでしょうか?
そんな時は、コマンドライン引数を実装しましょう。
ArgumentParserを使ったコマンドライン引数の実装例
早速、コードを記述していきます。
今回は、フォルダ内にある画像ファイルを読み込んで、リサイズして、別フォルダに保存するコードになってます。
import cv2
import os
from argparse import ArgumentParser
import glob
def get_option():
argparser = ArgumentParser()
argparser.add_argument('--in_dir', type=str, default = ".\\in_img", help='')
argparser.add_argument('--out_dir', type=str,default = ".\\out_img", help='')
argparser.add_argument('--size_w', type=int, default = 400)
argparser.add_argument('--size_h', type=int, default = 300)
return argparser.parse_args()
def img_resize(in_dir, out_dir, size_w, size_h):
img_list = glob.glob(os.path.join(in_dir,'*'))
print("file # : " + str(len(img_list)))
for infilename in img_list:
print("inputfile : " + infilename)
in_img = cv2.imread(infilename)
out_img = cv2.resize(in_img, (size_w, size_h), interpolation = cv2.INTER_AREA)
# data output
outfilename = infilename.rsplit('\\')[-1].split('.')[0]
cv2.imwrite(os.path.join(out_dir, outfilename) + "_out.bmp", out_img)
if __name__ == "__main__":
args = get_option()
in_dir = args.in_dir
out_dir = args.out_dir
os.makedirs(out_dir, exist_ok = True)
img_resize(in_dir, out_dir, args.size_w, args.size_h)
python標準ライブラリのArgumentParserを使ってコマンドライン引数を使ってます。
これを使うメリットは、
- コマンドライン引数の初期値を決められる
- 特定の引数だけを外部から変えられる
ことにあると思います。
ArgumentParserを使うメリット
1. コマンドライン引数の初期値を決められる
コード例では、4つのコマンドライン引数が与えられ、それぞれ初期値は以下の通りです。
- in_dir : .\in_img
- out_dir : .\in_img
- size_w : 400
- size_h : 300
このpythonコードをコマンドライン引数なしで実行すると、上記の初期値のまま処理してくれてます。
試しに、in_imgフォルダに適当な画像ファイルを置いて、コードを実行します。
> python .\img_resize.py
file # : 1
inputfile : .\in_img\test.jpg
out_imgフォルダにリサイズした画像ができました。
2. 特定の引数だけを外部から変えられる
次に、リサイズ後の画像の高さだけを600に変えて、実行します。
各コマンドライン引数の変化点は下記のイメージ。
- in_dir : .\in_img
- out_dir : .\in_img
- size_w : 400
- size_h : 300 → 600
試しに、in_imgフォルダに適当な画像ファイルを置いて、コードを実行します。
> python .\img_resize.py --size_h 600
file # : 1
inputfile : .\in_img\test.jpg
out_imgフォルダにできたリサイズ画像のサイズのうち、高さだけが初期値から変わりました。
まとめ
今回は、PythonでArgumentParserモジュールを使ったコマンドライン引数の使い方を記載しました。
このモジュールを使ったコマンドライン引数は結構便利なので、後からコロコロ変わりそうな変数はコマンドライン引数化しておくといいでしょう。
また、プログラムは対話型AIのChatGPTが得意としているところです。もしこちらの記事で不十分な場合、ChatGPTにサンプルコードを作成してもらってはいかがでしょうか。こちらにChatGPTの始め方やできることをまとめてますので、よろしければ参照してください。
コメント