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