본문 바로가기

IT/OS|Network|Script

Python config.ini 보다 입력받은 옵션을 더 우선시 하기

728x90

configparser 를 통해 argument를 파싱하고 비슷한 것을 config.ini 에 넣어 두었다고 가정

이때 config.ini 를 먼저 읽어서 argument쪽에 넣고 argument를 다시 읽으면 되는데, 이때 문제가 parser가 초기화를 한다.

그래서 무식한 방법이지만 default 에 넣는 방식으로 다음과 같이 처리하면 된다.

이때 형변환 부분이 있을 수 있는데, 이 부분은 아직 고려 하지 않았다.

예제소스

 

test.py

import configparser
import argparse
def loadConfig(cfgfile):
    my_cfg = configparser.RawConfigParser()
    my_cfg.optionxform = str
    my_cfg.read(cfgfile)
    return my_cfg
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Deep Packet Clustering Manager.')
    parser.add_argument('--cfgfile', required=False, type=str
                        , default="config.ini", help='config file')
    parser.add_argument('--loglevel', required=False, type=str
                        , default='warning'
                        , help='Provide logging level. Example --loglevel debug, default=warning')
    args = parser.parse_args()
    my_cfg = loadConfig(args.cfgfile)
    default_args_dict = { }
    print("Before", args)
    for cur_args in my_cfg['args']:
        default_args_dict[cur_args] = my_cfg.get('args', cur_args)
    parser.set_defaults(**default_args_dict)
    # ini > option (input) overwrite
    args = parser.parse_args()
    print("After", args)

config.ini 샘플

[args]
loglevel=info
workdir=

실행결과

$ python test.py
Before Namespace(cfgfile='config.ini', loglevel='warning')
After Namespace(cfgfile='config.ini', loglevel='info', workdir='')
$ python test.py --loglevel='debug'
Before Namespace(cfgfile='config.ini', loglevel='debug')
After Namespace(cfgfile='config.ini', loglevel='debug', workdir='')
728x90