티스토리 뷰

반응형

0. 들어가면서

코드를 바로 보면서 설명을 해 보겠다.

 

1. 기본 예제

config.py라는 파일을 만들어서 아래의 내용을 적었다고 가정하자.

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

저장한 파일을 실행해보자. 아무일도 일어나지 않는다.

 

2. add_ArgumentParser() 추가

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
  • add_argument() 매서드를 추가했다. 이 메서드는 프로그램이 받고 싶은 명령행 옵션을 지정하기 위해 사용한다. 여기서는 echo라고 name을 넣었다.
  • parse_args() 메서드는 실제로 지정된 옵션으로부터 온 데이터를 돌려준다.
  • argparse는 값이 저장되는 변수를 지정할 필요가 없다.

결과

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo


$ python3 prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit


$ python3 prog.py foo
foo

echo가 위치 인자임을 알 수 있다. 그러나 소스 코드를 읽는 것 외 다른 무엇을 하는지 좀 더 알아보자.

 

3. add_argument()에 help추가

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)

결과

$ python3 prog.py -h
usage: prog.py [-h] echo

positional arguments:
  echo        echo the string you use here

optional arguments:
  -h, --help  show this help message and exit

 

4. 정사각형 넓이 구하기

하나의 변에서 제곱을 하면 되겠군

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)

결과

$ python3 prog.py 4
Traceback (most recent call last):
  File "prog.py", line 5, in <module>
    print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

4를 넣었는데, TypeError뜬다. 보니 str을 int로 바꿔야 하나보다. 다시 정수취급하게 type을 넣자.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
                    type=int)
args = parser.parse_args()
print(args.square**2)

결과

$ python3 prog.py 4
16

$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

16이 결과값으로 잘 나온다. 여기서 또 알 수 있는 것은 잘못된 input 값이 들어오면 종료한다.

 

5. 옵션 인자

위에서는 위치인자를 다뤘고 이제 옵션 인자를 알아보자.

 

5-1. --verbosity

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print("verbosity turned on")
  • 이 프로그램은 if문을 통해 --verbosity 가 지정되었을 때 어떤 것을 표시하고 그렇지 않을 때는 아무것도 표시하지 않도록 작성했다

  • 옵션이 실제로 선택 사항임을 확인하기 위해, 이 옵션을 사용하지 않고 프로그램을 실행할 때 오류가 없다. 기본적으로 옵션 인자가 사용되지 않는다면 관련 변수 (이 경우 args.verbosity)는 값으로 None 이 주어집니다. 이 때문에 if 문의 논리값 검사가 실패한다.

  • 도움말 메시지가 약간 달라진다.

  • --verbosity 옵션을 사용할 때, 어떤 값이든 상관없이 값을 지정해야 한다.

결과

$ python3 prog.py --verbosity 1
verbosity turned on

$ python3 prog.py
#아무일도 안일어남

$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]

optional arguments:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity
                        
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument

 

5.2 verbose

--verbosity는 임의의 정수값만 허용한다. 이제 True와 False 값만 사용할 수 있게 코드를 작성해 보자.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")
  • 이 옵션은 이제 값을 요구하는 것이 아니라 flag이다. 이 개념과 일치하도록 옵션의 이름을 변경했다. 새로운 키워드 action 을 지정하고, "store_true" 값을 지정한 이유는 옵션이 지정되면 args.verbose 에 값 True 를 대입하라는 뜻입니다. 지정하지 않으면 묵시적으로 False 입니다.

  • 도움말 텍스트가 바뀐 것을 확인하자.

 

5.3 길이 줄여 사용하기

사실 간단하다.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

 

$ python3 prog.py -v
verbosity turned on

$ python3 prog.py --help
usage: prog.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

 

6. 위치인자와 옵션인자 합치기

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print("the square of {} equals {}".format(args.square, answer))
else:
    print(answer)
  • 위치인자는 반드시 적어줘야한다.
  • 위치, 옵션인자는 어떤절 먼저 적어도 상관없다.

결과

$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square

$ python3 prog.py 4
16

$ python3 prog.py 4 --verbose
the square of 4 equals 16

$ python3 prog.py --verbose 4
the square of 4 equals 16

 

+

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python3 prog.py 4
16

$ python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument

$ python3 prog.py 4 -v 1
4^2 == 16

$ python3 prog.py 4 -v 2
the square of 4 equals 16

$ python3 prog.py 4 -v 3
16

 

 

+ --verbosity에 choices 옵션을 넣자. choices 안에 있는 숫자만 쓰기 가능

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)

$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square

positional arguments:
  square                display a square of a given number

optional arguments:
  -h, --help            show this help message and exit
  -v {0,1,2}, --verbosity {0,1,2}
                        increase output verbosity

 

 

+ 횟수를 개산하기 위해서 count라는 action을 넣어보자.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python3 prog.py 4
16

$ python3 prog.py 4 -v
4^2 == 16

$ python3 prog.py 4 -vv
the square of 4 equals 16

$ python3 prog.py 4 --verbosity --verbosity
the square of 4 equals 16

$ python3 prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1

$ python3 prog.py 4 -h
usage: prog.py [-h] [-v] square

positional arguments:
  square           display a square of a given number

optional arguments:
  -h, --help       show this help message and exit
  -v, --verbosity  increase output verbosity

$ python3 prog.py 4 -vvv
16
  • 이제 이전 버전의 스크립트처럼 (action="store_true" 와 유사하게) 플래그가 됀거다. 

  • 이제 여기에서 《count》 액션이 제공하는 것을 보여준다.

  • 그리고, -v 플래그를 지정하지 않으면 그 플래그는 None 값으로 간주합니다.

  • if문에 있는 내용이 주어 져야하겠군.

  • 마지막 출력은 if 조건에 포함되지 않아 우리 프로그램의 버그를 노출한다고 할 수 있다..

위 내동을 수정해서 다시 작성.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2

# bugfix: replace == with >=
if args.verbosity >= 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)
$ python3 prog.py 4 -vvv
the square of 4 equals 16

$ python3 prog.py 4 -vvvv
the square of 4 equals 16

$ python3 prog.py 4
Traceback (most recent call last):
  File "prog.py", line 11, in <module>
    if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

3번째 출력이 에러가 뜬다. 수정해보자.

 

+ default 값 추가하기

기본 적으로 옵션 인자가 지정되지 않으면 None 값을 갖게 된다. 그리고 None은 int값과 비교가 안된다. 그렇기 때문에 TypeError 를 일으킨다.

 

여기까지가 매우 기초적인 내용을 다룬거다.

 

 

7. 거듭제곱 수행

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
elif args.verbosity >= 1:
    print("{}^{} == {}".format(args.x, args.y, answer))
else:
    print(answer)
$ python3 prog.py
usage: prog.py [-h] [-v] x y
prog.py: error: the following arguments are required: x, y

$ python3 prog.py -h
usage: prog.py [-h] [-v] x y

positional arguments:
  x                the base
  y                the exponent

optional arguments:
  -h, --help       show this help message and exit
  -v, --verbosity
  
$ python3 prog.py 4 2 -v
4^2 == 16

 

 

+

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
    print("Running '{}'".format(__file__))
if args.verbosity >= 1:
    print("{}^{} == ".format(args.x, args.y), end="")
print(answer)
$ python3 prog.py 4 2
16

$ python3 prog.py 4 2 -v
4^2 == 16

$ python3 prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16

 

 

지금까지 argparse.ArgumentParser 인스턴스의 두가지 매서드로 작업을 했다. 아래 부터는 add_mutually_exclusive_group()을 사용하여 서로 배타적인 옵션을 지정할 수 있다. 아래는 서로 배타적인 --quiet와 --verbose를 사용한다.

 

 

8. --quiet

쉽게 말하면 --quiet메서드는 --verbose 의 반대라고 할 수 있다.

mport argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
    print("{}^{} == {}".format(args.x, args.y, answer))
$ python3 prog.py 4 2
4^2 == 16

$ python3 prog.py 4 2 -q
16

$ python3 prog.py 4 2 -v
4 to the power 2 equals 16

$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

$ python3 prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

여기서 포인트는 -v와 -q를 동시에 사용 할 수 없다.

 

9. 정리

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
    print("{}^{} == {}".format(args.x, args.y, answer))
$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, --quiet
반응형

'인공지능(Artificial Intelligence) > python' 카테고리의 다른 글

python if문 기초 정리  (0) 2020.12.23
python 올림, 내림, 반올림 기초정리  (0) 2020.12.22
NumPy 1.기초  (0) 2020.09.14
Data Structure_Collections  (0) 2020.07.11
pythonic Code_Asterisk(*)  (0) 2020.07.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함