inch-blog

Welcome to Inch-blog ! Home is a place where you can read mainly technical articles. LIFE is mainly about my personal life.

Python のプログラムを作成する際の template files

ファイル

main.py

まず main.py です.

import pytz
from datetime import datetime
from utils import parse_args
from pprint import pprint

def main():
    params = parse_args()
    print()
    pprint(params)
    print()
    for key in params:
        print(key, params[key], type(params[key]))

if __name__ == "__main__":

    start = datetime.now(pytz.timezone('Asia/Tokyo'))
    print()
    print("Train Started at {}".format(start))
    print()
    main()
    print()


    print("Train Started at {}".format(start))
    finish = datetime.now(pytz.timezone('Asia/Tokyo'))
    print("Train Finished at {}".format(finish))
    print("Elapsed Time: {}".format(finish - start))
utils.py

続いて utils.py です.

import argparse
import torch
import os
import json

def parse_args():
    parser = argparse.ArgumentParser(
        description='この python プログラムについての説明 -h または --help 時に表示'
    )

    # デフォルトを指定する場合
    parser.add_argument('--comment', default='', help='実行する際のコメントを残す')

    # 好きな順序で指定する場合は "--name", required=True とする.

    # 型を指定する場合
    parser.add_argument('--epoch', type=int, required=True, help='epoch 数')

    # boolean で指定する場合
    # 指定されていると True そうでないときは False 
    parser.add_argument('--local', action='store_true', help='local かどうか')

    # 指定する内容を選択肢の中から選択する場合
    parser.add_argument('--optimizer', choices=['Adam', 'SGD', 'AdaGrad'])

		parser.add_argument("--output_dir", default="outputs", type=str)

    # 引数を解析
    args = parser.parse_args()
	
    workspace_dir = os.path.join("/var", "www", "workspace", "clip-image-search")
    output_dir = os.path.join(workspace_dir, args.output_dir)
		os.makedirs(output_dir, exist_ok=True)

	
		# args の保存
    args_dict = vars(args)
    params_path = os.path.join(output_dir, "params.json")
	  with open(params_path, "w") as f:
	    json.dump(args_dict, f, indent=4)
	
    # args から params を作成
    with open(params_path, "r") as f:
	    params = json.load(f)

		
    params["device"] = 'cuda' if torch.cuda.is_available() else 'cpu'

    return params
command.sh

続いて command.sh です.

# フルで指定する場合
python main.py --comment=message --epoch=10 --local --optimizer=Adam

# required=True だけ指定する場合
python main.py --epoch=10

出力

help

プログラムの help を出力すると以下のように出力される.

root@081b783a2465:/var/www/workspace# python main.py -h

Train Started at 2023-01-29 22:09:57.270306+09:00

usage: main.py [-h] [--comment COMMENT] --epoch EPOCH [--local] [--optimizer {Adam,SGD,AdaGrad}]

この python プログラムについての説明 -h または --help 時に表示

optional arguments:
  -h, --help            show this help message and exit
  --comment COMMENT     実行する際のコメントを残す
  --epoch EPOCH         epoch 数
  --local               local かどうか
  --optimizer {Adam,SGD,AdaGrad}
実行結果

sh command.sh として main.py を実行すると以下のように出力される.

フルで指定した場合

root@081b783a2465:/var/www/workspace/cliplearn# sh command.sh 

Train Started at 2023-01-29 22:12:38.957051+09:00


{'comment': 'message',
 'device': 'cuda',
 'epoch': 10,
 'local': True,
 'optimizer': 'Adam'}

comment message <class 'str'>
epoch 10 <class 'int'>
local True <class 'bool'>
optimizer Adam <class 'str'>
device cuda <class 'str'>

Train Started at 2023-01-29 22:12:38.957051+09:00
Train Finished at 2023-01-29 22:12:38.977580+09:00
Elapsed Time: 0:00:00.020529

required=True だけ指定する場合

root@081b783a2465:/var/www/workspace/cliplearn# sh command.sh 

Train Started at 2023-01-29 22:12:39.524942+09:00


{'comment': '',
 'device': 'cuda',
 'epoch': 10,
 'local': False,
 'optimizer': None}

comment  <class 'str'>
epoch 10 <class 'int'>
local False <class 'bool'>
optimizer None <class 'NoneType'>
device cuda <class 'str'>

Train Started at 2023-01-29 22:12:39.524942+09:00
Train Finished at 2023-01-29 22:12:39.528479+09:00
Elapsed Time: 0:00:00.003537

params の保存

作成した params を保存する場合は

import os
import json

params_path = os.path.join("/var", "www", "workspace", "kwags.json")
with open(params_path, 'w') as f:
    json.dump(params, f, indent=4)

とすればいい.