【Python-Module】 argparse/yaml/logging python 모듈 공부 내용 정리
(위성Segment) argparse/yaml/logging python 모듈 공부 내용 정리 pytorch-semseg코드를 공부하면서 앞으로 계속 나오게 될 argparse/yaml 에 대해서 공부하고 정리한 내용을 기록해 놓는다.
참고 페이지 : https://github.com/meetshah1995/pytorch-semseg/issues/188
- http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#data
- http://home.bharathh.info/pubs/codes/SBD/download.html
1. Referece for argparse
- http://blog.naver.com/PostView.nhn?blogId=cjh226&logNo=220997049388&parentCategoryNo=&categoryNo=17&viewDate=&isShowPopularPosts=false&from=section
- https://greeksharifa.github.io/references/2019/02/12/argparse-usage/
- https://brownbears.tistory.com/413
첫번쩨 Reference 공부내용 정리
- arg+parse = argument(parameter) + parsing
# 예제코드
from __future__ import print_function
import argparse
def main():
parser = argparse.ArgumentParser(description='This code is written for practice about argparse')
parser.add_argument('X', type=float,
metavar='First_number',
help='What is the first number?')
parser.add_argument('Y', type=float,
metavar='Second_number',
help='What is the second number?')
parser.add_argument('--op', type=str, default='add',
choices=['add','sub','mul','div'],
help='What operation?')
args = parser.parse_args()
X = args.X
Y = args.Y
op = args.op
print(calc(X,Y,op))
def calc(x, y, op):
if op == 'add':
return x + y
elif op == 'sub':
return x - y
elif op == 'mul':
return x * y
elif op == 'div':
return x / y
if __name__=="__main__":
main()
- 기초 코드
- argparse.ArgumentParser함수를 통해 parser를 생성한다.
- parser.add_argument를 이용하여 입력받고자 하는 인자의 조건을 설정한다
- parser.parse_args 함수를 통해 인자들을 파싱하여 args에 저장한다. 각 인자는 add_argument의 type에 지정된 형식으로 저장된다
- parser.add_argument에 들어갈 수 있는 옵션
- type/ default/ choices/ help 등등
- 여기서 choices를 사용함으로써 help에서 어떤 옵션이 가능한지 보여준다.
- metavar는 필수 인자를 입력하지 않았을 때, 그 자리 변수가 무엇인지에 대한 이름이다.
- nargs=’+’를 사용함으로써, 여러개의 (제한 없음) 변수를 리스트로 받을 수 있다.
- parser.parse_args()로 정의된 객체 args 사용방법
- X = args.X // Y = args.Y
- op = args.op 에서 처럼 –[]라고 add_argument를 했다면, args.[]라고 사용가능하다.
두번쨰 Reference 공부내용 정리
- 위의 기초 코드 3개 중, ArgumentParser와 add_argument에 사용가능한 메소드들이 잘 정리되어 있다.
세번쨰 Reference 공부내용 정리
- 지금까지 한 것보다 조금 더 심화된 내용이 설명되어 있다.
- 이 정도는 필요할 때마다 찾아보기로 하자.
2. Referece for yaml
- https://itholic.github.io/python-yaml/
- https://teeeeeeemo.tistory.com/39
- https://junho85.pe.kr/1451
기본 사용방법은 매우 간단하다.
이와 같은 파일이 있다고 치자
# /home/info/yaml language: python test: pytes
이렇게 py파일에서 쓰면 된다.
import yaml with open('info.yaml') as f: cfg = yaml.load(f) language = conf['language'] test = cfg['pytest']
즉, yaml 모듈의 load함수를 통해서 conf를 dictionary 객체로 만들어 준다.
추가 사용법
모르겠으면 우선 yaml파일을 가져오고, type과 같은 함수를 이용해서 내가 가지고 있는 yaml.load로 선언한 객체에 대한 분석을 해보자.
코드 예제
# yaml 파일 yaml_str = """ Date: 2017-08-08 ChampionList: - champion_id: 1000 name: Teemo position: top skill: ap - champion_id: 1001 name: Vayne position: bottom skill: ad - champion_id: 1002 name: Ahri position: mid skill: ap """ # .py 파일 내부 코드 import yaml cfg = yaml.load(yaml_str) for champion in cfg['ChampionList']: print(champion["name"], champion["skill"])
3. Reference for logging
- https://ourcstory.tistory.com/97
- https://minimin2.tistory.com/41
- https://snowdeer.github.io/python/2017/11/17/python-logging-example/
<기본사용법>
로그 출력을 위한
logging
모듈을 제공합니다. 아주 간단히 사용할 수 있으며,print
함수 등을 통해 콘솔창에 지저분하게 출력하는 것보다logging
모듈을 사용하는 것을 추천한다. 콘솔창과 파일에 동시에 로그 남기는 것이 가능하다.로그를 콘솔에도 출력하고 싶고, 파일에도 동시에 남기고 싶다면 아래와 같이 fileHandler, streamHandler를 생성해서 logger에 Handler를 추가해주면 된다
로그 포매팅이라고 하면, 내가 로그를 남길때 앞에 쓰여지는 형식의 포맷을 정하는 것을 말한다 로그 포매팅 : %(log_name)s 를 사용하고 중간에 문자를 자유롭게 첨가
import logging import logging.handlers # logger 인스턴스를 생성 및 로그 레벨 설정 logger = logging.getLogger("crumbs") logger.setLevel(logging.DEBUG) # formmater 생성 <***adding***> formatter = logging.Formatter('[%(levelname)s|%(filename)s:%(lineno)s] %(asctime)s > %(message)s') # fileHandler와 StreamHandler를 생성 fileHandler = logging.FileHandler('./log/my.log') streamHandler = logging.StreamHandler() # handler에 fommater 세팅 <***adding***> fileHandler.setFormatter(formatter) streamHandler.setFormatter(formatter) # Handler를 logging에 추가 logger.addHandler(fileHandler) logger.addHandler(streamHandler) # logging logger.debug("debug") logger.info("info") logger.warning("warning") logger.error("error") logger.critical("critical") ''' 출력결과 [DEBUG|input.py:24] 2016-05-20 10:37:06,656 > debug [INFO|input.py:25] 2016-05-20 10:37:06,657 > info [WARNING|input.py:26] 2016-05-20 10:37:06,657 > warning [ERROR|input.py:27] 2016-05-20 10:37:06,657 > error [CRITICAL|input.py:28] 2016-05-20 10:37:06,657 > critical
다른 코드를 통해 좀 더 알아보자. setLevel(logging.DEBUG) -> setLevel(logging.INFO)
import logging # 로그 생성 logger = logging.getLogger() # 로그의 출력 기준 설정 logger.setLevel(logging.INFO) # log 출력 형식 기본 포맷 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # log 출력 stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # log를 파일에 출력 file_handler = logging.FileHandler('my.log') file_handler.setFormatter(formatter) logger.addHandler(file_handler) for i in range(10): logger.info(f'{i}번째 방문입니다.')ㄴ