콘텐츠로 건너뛰기
Home » argparse – Python 명령줄도구의 인자분석

argparse – Python 명령줄도구의 인자분석

케이스별 실제 사용 예 위주로 정리한 새 글이 있으니 참고하세요.

argparse

https://docs.python.org/3/library/argparse.html?highlight=argparse#module-argparse

CLI툴을 만들 때 다양한 옵션 스위치들을 제공하려는 경우, 이를 일일이 파싱1하는 것은 사실 쉽지 않다.파이썬에서는 argparse 모듈이 이러한 작업을 보다 편하게 할 수 있게 도와준다.

ArgumentParser

argparse.ArgumentParser 클래스는 명령줄 옵션을 파싱하는 객체이다. 별다른 서브클래싱없이 그대로 가져다가 객체를 생성하면 된다. 객체 생성후에는 add_argument() 함수를 통해서 각 스위치와 그 옵션들을 추가해주고, 최종적으로 전달된 arguments들을 던져주면 사전형태2로 이를 돌려주게 된다.

import argparse
parser = argparse.ArgumentParser(description="args parser")

add_argement()

파서객체의 add_argument() 메소드는 파라미터 파싱처리의 핵심을 담당한다고 해도 과언이 아니다.

시그니처는 대략 다음과 같다.

.add_argument(name or flags...[,action][,nargs][,default][,type][,choices][,required][,help][,metavar][,dest])

각 옵션들은 다음과 같은 역할을 한다.

  • 우선 한 번에 한 종류의 스위치를 등록할 수 있다.
  • name or flags : 등록할 파라미터의 이름이나 스위치를 등록한다. “foo”, “-f”, “–foo” 등이 가능하다.
  • action: 스위치가 주어졌을 때, 표준 동작을 정한다. 기본값은 “store”이고 이는 주어진 스위치의 옵션 값을 플래그(혹은 이름)의 키에 저장한다. 단지 on/off 개념의 스위치라면 "store_true"를 줄 수 있다. 또 배열형태로 저장될 복수 사용되는 스위치([[GCC의 ‘-I’ 옵션]] 같은)에는 "append"를 줄 수 있다. 개수만 세는 경우 “count”를 줄 수도 있고.
  • nargs : 스위치나 파라미터가 받을 수 있는 값의 개수를 가리킨다. 이 값보다 많은 값이 들어오는 경우 무시된다. “+”로 설정하는 경우 1개 이상.
  • default: 뒤에 별도 값이 없는 경우 디폴트로 들어갈 값
  • type: 파싱하여 저장할 때 타입을 변경할 수 있다.
  • choices: 리스트 형태로 전달하면, 리스트의 원소와 일치하는 것만 취한다.
  • required: 필수 파라미터인 경우 True로 설정. 없으면 알아서 에러메시지를 표시하고 자동으로 exit한다.
  • help: –help 옵션을 받았을 때, 표시될 메시지 목록에서 스위치의 도움말을 설정한다.
  • metavar: usage 메시지를 출력할 때 표시할 메타변수이름을 지정해준다.
  • dest : 스위치나 파라미터이름이 아닌 별도의 변수를 지정할 때 쓴다. 외부에서 변수를 미리 선언한 경우, 해당 변수에 값이 들어간다.

.parse_args()

각 인자의 리스트를 받아 이를 파싱한 결과를 되돌려 준다. 파싱된 결과는 하나의 네임스페이스를 갖는 객체로 모든 스위치 이름들은 이 객체의 속성 이름으로 정의되어 있다.

만약 인자값을 넘기지 않는다면 기본적으로 sys.argv를 사용하게 된다.


  1. 일련의 문자열을 의미를 가지는 보다 작은 단위로 분해하여 나누는 일. 간단한 파싱의 경우 단순 문자열 치환이나 분해로 가능하지만, 보통의 경우 파서를 제작하는 일은 꽤 어렵다. 명령줄 인자 파싱의 경우에도 오죽하면 C에서도 이를 위한 함수들을 제공하고 있을정도이다! 
  2. 정확히는 사전이 아니라, 추가한 argument들을 대상으로 하는 네임스페이스를 구비한 객체를 전달한다. 왜냐하면 동일한 기능을 하는 스위치를 2개 이상의 이름을 줄 수 있기 때문이다. 예를 들어 -o--output은 동일한 스위치로 둘 수 있는데, 이 경우 args.oargs.output 둘 모두로 동일한 값에 접근가능하다.