Python 명령행 인자 받기 (argparse)

명령행(command line)에서 파이썬을 실행시킬 때 argparse 모듈을 이용하여 인자를 받는 방법을 소개합니다.

1. argparse로 인자 받기

아래 예제처럼 원하는 옵션 이름으로 명령행에서 인자를 받을 수 있습니다.

  • argparse.ArgumentParser()로 parser 생성
  • add_argument()으로 어떻게 파싱할 것인지 옵션을 설정할 수 있음, 첫번째 인자는 -n처럼 짧은 형태의 옵션이며, 두번째 인자는 --name처럼 긴 형태의 옵션
  • parse_args() 호출 시, 설정된 내용으로 인자를 파싱
  • -n 또는 --name으로 입력 받은 내용은 args.print처럼 옵션 이름으로 변수 접근이 가능함
  • 헬프 옵션 (-h, --help)은 기본으로 제공됨
#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-n', '--name', help="input your name")
    parser.add_argument('-p', '--print', action='store_true', help="shows name")

    args = parser.parse_args()

    if args.print:
        print(f"name: {args.name}")

아래와 같이 인자를 입력하면, args.name = John으로 입력되며, args.print = True가 됩니다. -p의 경우 action에 store_true를 입력했기 때문에 명령행에 -p를 입력하면 print = True로 설정되며, -p를 입력하지 않으면 print = False로 설정됩니다.

$ python main.py -n John -p
name: John

-h는 헬프 명령어인데, 기본적인 내용이 있고 여기에 add_argument()에 추가한 옵션도 함께 보여집니다. -h에서 보이는 메시지는 add_argument()의 help로 전달한 메시지가 됩니다.

$ python main.py -h
usage: main.py [-h] [-n NAME] [-p]

optional arguments:
  -h, --help            show this help message and exit
  -n NAME, --name NAME  input your name
  -p, --print           shows name

2. 필수 옵션 설정

만약 어떤 옵션은 꼭 사용자가 설정해야 할 필요가 있을 때, required=True를 설정하면 사용자가 입력하지 않았을 때 에러가 발생되며, 입력해야 한다는 메시지가 발생합니다.

#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-n', '--name', help="input your name", required=True)
    parser.add_argument('-p', '--print', action='store_true', help="shows name")

    args = parser.parse_args()

    if args.print:
        print(f"name: {args.name}")

아래와 같이 -n을 입력하지 않으면 에러가 발생합니다.

$ python main.py -p
usage: main.py [-h] -n NAME [-p]
main.py: error: the following arguments are required: -n/--name

3. 짧은 옵션(short option)만 사용, 변수 이름 변경

아래 예제처럼 short option -n만 사용할 수 있습니다. 인자는 args.n 변수로 접근할 수 있습니다.

#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-n', help="Your name")
    args = parser.parse_args()

    print(f"name: {args.n}")

이런 변수 이름이 직관적이지 않을 때, dest=로 변수 이름을 변경할 수 있습니다.

아래 예제에서는 dest='name'으로 변수 이름을 name으로 변경하였습니다.

#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-n', dest='name', help="Your name")
    args = parser.parse_args()

    print(f"name: {args.name}")

아래와 같이 명령어를 입력했을 때, name에 인자가 저장되는 것을 볼 수 있습니다.

$ python main.py -n John
name: John

4. Positional Arguments

-n 같은 옵션 이름을 설정하지 않고, 그냥 명령행에 인자를 연속적으로 입력하고, 프로그램은 해당 위치마다 특정 값으로 인식하여 처리할 수 있습니다.

아래와 같이 add_argument()에 이름만 지정해주면 됩니다.

#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('id')
    parser.add_argument('pw')

    args = parser.parse_args()

    print(f"id: {args.id}")
    print(f"pw: {args.pw}")

터미널에서 인자를 전달할 때 아래와 같이 인자 두개를 입력하면, 프로그램에서 순차적으로 id와 pw로 읽어서 처리합니다.

$ python main.py john1234 abcd4444
id: john1234
pw: abcd4444

5. Integer, String, Boolean으로 인자 받기

  • add_argument()type=int를 지정하면, 인자를 정수로 받습니다.
  • 아무것도 입력하지 않으면 문자열로 받습니다.
  • 옵션 입력 여부에 따라 True/False로 boolean을 받고 싶을 때, action에 store_true를 지정합니다.
#!/usr/bin/python

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-i', '--integer', type=int)
    parser.add_argument('-s', '--string')
    parser.add_argument('-b', '--boolean', action='store_true')

    args = parser.parse_args()

    print(f"i: {args.integer}, type: {type(args.integer)}")
    print(f"s: {args.string}, type: {type(args.string)}")
    print(f"b: {args.boolean}, type: {type(args.boolean)}")

아래와 같이 옵션을 입력했을 때, 결과는 다음과 같습니다.

$ python main.py -i 100 -s abcd -b
i: 100, type: <class 'int'>
s: abcd, type: <class 'str'>
b: True, type: <class 'bool'>

-b를 입력하지 않으면 boolean은 False로 설정됩니다.

$ python main.py -i 100 -s abcd
i: 100, type: <class 'int'>
s: abcd, type: <class 'str'>
b: False, type: <class 'bool'>
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha