파이썬 파일 실행 시 원하는 인자를 커맨드라인 상에서 전달하기 위해 argparse 패키지를 많이 사용할 겁니다. 실제로 파이썬에서 처음 접하게 되는 내장 라이브러리 중 하나입니다만 argument를 추가할 때 사용하는 함수의 (add_argument 함수) type, default 인자 이외의 생소한 인자를 만나게 되면 항상 사용법을 검색하게 되는데, 저 같은 경우는 nargs/const/default 인자입니다.
nargs 인자
nargs 인자는 Number of Arguments 의미를 가지며 말 그대로 해당 argument에 대해 몇 개의 value를 넣을 것인지를 정합니다. 구체적인 숫자를 넣어도 되고 쉘 스크립트에서 사용되는 wildcard 캐릭터도 사용법이 미리 정의되어 있습니다. CLI 상에 전달할 argument 이름을 "test"라고 한다면,
- nargs="구체적인 숫자": 파이썬 실행 시 "test" argument에 대해 지정한 숫자만큼의 값을 전달해야 합니다.
- nargs="?": "test" argument에 대해 하나의 값이 올 수도 있고 안 올 수도 있습니다. (Optional)
- nargs="*": 유연한 숫자가 가능하고 리스트로 묶이게 됩니다.
- nargs="+": "*"와 비슷하나 최소 하나의 값이 필요합니다. (마찬가지로 리스트로 리턴됩니다)
nargs="?" with const, default
nargs="?" 일 때, const, default 인자가 같이 사용되고 있는 경우가 많습니다. nargs="?" 이면 해당하는 "test" argument가 값을 받아도 되고 한 개만 받아도 되기 때문에 CLI에서 선언될 수도 있고 안 될 수도 있습니다. 파이썬 실행 시 "test" argument에 값이 전달되지 않는다면 default 값이, 입력만 된다면 const 값이, 값까지 같이 입력되면 입력한 값이 "test" argument에 반영됩니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test", nargs="?", const=0, default=1, type=int)
args = parser.parse_args()
print(args)
python main.py
>> Namespace(test=1)
python main.py --test
>> Namespace(test=0)
python main.py --test 2
>> Namespace(test=2)
- const 인자를 사용하기 위해서는 nargs 값은 무조건 "?" 이어야 합니다.
nargs=argparse.REMAINDER
마지막으로 nargs=argparse.REMAINDER 옵션도 있습니다. 이 옵션은 보통 선언할 마지막 argument에 사용되는데, CLI 상에서 값들이 각 argument에 할당되고 나머지 모든 값들을 리스트 형태로 받고 보통 "--" 구분자 없이 사용합니다.
- "--test" 대신 "test"로 add_argument 함수에 사용한다면 CLI에서 "--test"로 값을 전달할 시에 에러가 납니다.
- 따라서 "--" 형태 없이 add_argument 함수를 선언하면 CLI에서 선언된 위치에 맞게 값을 자동으로 가져오게 되는데요,
- 보통 가장 마지막 선언되는 argument에서 "--" 형태를 빼고 사용됩니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("test", default=10, type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)
python main.py --test 0 1 2 3 4
>> usage: argparser_test.py [-h] test ...
>> argparser_test.py: error: unrecognized arguments: --test
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test", default=10, type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)
python main.py --test 0 1 2 3 4
>> Namespace(test=1, test_remainder=[2, 3, 4])
단, 다음과 같이 두 개의 argument가 복수의 값을 받을 수 있다면 모든 값들은 nargs="*"로 먼저 선언된 "test" argument로 할당되고 "test_remainder" argument에는 남은 값들이 없다고 설정되어 빈 리스트가 됩니다. 따라서 nargs 인자를 복수로 할당할 수 있는 argument를 여러 개 설정하게 되면 이러한 순서 및 형태를 주의 깊게 구현해야 합니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test", default=10, nargs="*", type=int)
parser.add_argument("test_remainder", nargs=argparse.REMAINDER, type=int)
args = parser.parse_args()
print(args)
python main.py --test 0 1 2 3 4
>> Namespace(test=[1, 2, 3, 4], test_remainder=[])
'Computer > Python' 카테고리의 다른 글
파이썬의 추상 클래스 (Abstract Class) (0) | 2023.05.06 |
---|---|
Numba (2) - 타입 컨테이너, 루프 퓨전 (0) | 2022.10.02 |
파이썬 코드 C언어로 컴파일하기 (3) - 사이썬과 넘파이 (0) | 2022.10.01 |
파이썬 코드 C언어로 컴파일하기 (2) (0) | 2022.10.01 |
파이썬 코드 C언어로 컴파일하기 (1) (0) | 2022.10.01 |