(위성Segment) argparse/yaml/logging python 모듈 공부 내용 정리
**pytorch-semseg**코드를 공부하면서
앞으로 계속 나오게 될 argparse/yaml 에 대해서 공부하고 정리한 내용을 기록해 놓는다.
<Pascal VOC 데이터 셋>
참고 페이지 : 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
기본 사용방법은 매우 간단하다.
-
이와 같은 파일이 있다고 치자
# /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}번째 방문입니다.')ㄴ