【Python-Module】 argparse/yaml/logging python 모듈 공부 내용 정리

(위성Segment) argparse/yaml/logging python 모듈 공부 내용 정리 pytorch-semseg코드를 공부하면서 앞으로 계속 나오게 될 argparse/yaml 에 대해서 공부하고 정리한 내용을 기록해 놓는다.

참고 페이지 : https://github.com/meetshah1995/pytorch-semseg/issues/188

  1. http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#data
  2. http://home.bharathh.info/pubs/codes/SBD/download.html

1. Referece for argparse

  1. http://blog.naver.com/PostView.nhn?blogId=cjh226&logNo=220997049388&parentCategoryNo=&categoryNo=17&viewDate=&isShowPopularPosts=false&from=section
  2. https://greeksharifa.github.io/references/2019/02/12/argparse-usage/
  3. 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()
  1. 기초 코드
    • argparse.ArgumentParser함수를 통해 parser를 생성한다.
    • parser.add_argument를 이용하여 입력받고자 하는 인자의 조건을 설정한다
    • parser.parse_args 함수를 통해 인자들을 파싱하여 args에 저장한다. 각 인자는 add_argument의 type에 지정된 형식으로 저장된다
  2. parser.add_argument에 들어갈 수 있는 옵션
    • type/ default/ choices/ help 등등
    • 여기서 choices를 사용함으로써 help에서 어떤 옵션이 가능한지 보여준다.
    • metavar는 필수 인자를 입력하지 않았을 때, 그 자리 변수가 무엇인지에 대한 이름이다.
    • nargs=’+’를 사용함으로써, 여러개의 (제한 없음) 변수를 리스트로 받을 수 있다.
  3. parser.parse_args()로 정의된 객체 args 사용방법
    • X = args.X // Y = args.Y
    • op = args.op 에서 처럼 –[]라고 add_argument를 했다면, args.[]라고 사용가능하다.

두번쨰 Reference 공부내용 정리

  1. 위의 기초 코드 3개 중, ArgumentParseradd_argument에 사용가능한 메소드들이 잘 정리되어 있다.
  2. image

세번쨰 Reference 공부내용 정리

  • 지금까지 한 것보다 조금 더 심화된 내용이 설명되어 있다.
  • 이 정도는 필요할 때마다 찾아보기로 하자.

2. Referece for yaml

  1. https://itholic.github.io/python-yaml/
  2. https://teeeeeeemo.tistory.com/39
  3. https://junho85.pe.kr/1451

기본 사용방법은 매우 간단하다.

  1. 이와 같은 파일이 있다고 치자

    # /home/info/yaml
    language: python
    test: pytes
    
  2. 이렇게 py파일에서 쓰면 된다.

    import yaml
       
    with open('info.yaml') as f:
        cfg = yaml.load(f)
       
       
    language = conf['language']
    test = cfg['pytest']
    

    즉, yaml 모듈의 load함수를 통해서 conf를 dictionary 객체로 만들어 준다.

  3. 추가 사용법

    • 모르겠으면 우선 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

  1. https://ourcstory.tistory.com/97
  2. https://minimin2.tistory.com/41
  3. https://snowdeer.github.io/python/2017/11/17/python-logging-example/

<기본사용법>

  1. 로그 출력을 위한 logging 모듈을 제공합니다. 아주 간단히 사용할 수 있으며, print 함수 등을 통해 콘솔창에 지저분하게 출력하는 것보다 logging 모듈을 사용하는 것을 추천한다. 콘솔창과 파일에 동시에 로그 남기는 것이 가능하다.

  2. 로그를 콘솔에도 출력하고 싶고, 파일에도 동시에 남기고 싶다면 아래와 같이 fileHandler, streamHandler를 생성해서 logger에 Handler를 추가해주면 된다

  3. 로그 포매팅이라고 하면, 내가 로그를 남길때 앞에 쓰여지는 형식의 포맷을 정하는 것을 말한다 로그 포매팅 : %(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
    
  4. 다른 코드를 통해 좀 더 알아보자. 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}번째 방문입니다.')
    

© All rights reserved By Junha Song.