티스토리 뷰
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
- read_csv
- vuejs
- react
- useHistory 안됨
- nodejs
- django
- TensorFlow
- JavaScript
- login
- react autoFocus
- Vue
- Deque
- Queue
- UserCreationForm
- logout
- typescript
- DFS
- error:0308010C:digital envelope routines::unsupported
- next.config.js
- mongoDB
- nextjs autoFocus
- 클라우데라
- pandas
- NextJS
- useState
- Python
- 자료구조
- BFS
- 자연어처리
- Express
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |