Python의 Argparse에서 동일한 옵션을 여러 번 사용하기
저는 여러 입력 소스를 받아들이고 각각에게 무언가를 하는 스크립트를 작성하려고 합니다.이런 거.
./my_script.py \
-i input1_url input1_name input1_other_var \
-i input2_url input2_name input2_other_var \
-i input3_url input3_name
# notice inputX_other_var is optional
하지만 어떻게 해야 할지 모르겠어요argparse
각 옵션 플래그는 한 번만 사용할 수 있도록 설정된 것 같습니다.여러 인수를 단일 옵션과 연결하는 방법을 알고 있습니다(nargs='*'
또는nargs='+'
), 하지만 그것은 여전히 내가 그것을 사용하도록 허락하지 않습니다.-i
플래그를 여러 번 표시합니다.어떻게 하면 이것을 달성할 수 있을까요?
분명히 말씀드리자면, 마지막으로 제가 원하는 것은 문자열 목록입니다.
[["input1_url", "input1_name", "input1_other"],
["input2_url", "input2_name", "input2_other"],
["input3_url", "input3_name"]]
여기 반복되는 2개의 인수를 선택적으로 처리하는 파서가 있습니다 - 이름은 다음에 정의되어 있습니다.metavar
:
parser=argparse.ArgumentParser()
parser.add_argument('-i','--input',action='append',nargs=2,
metavar=('url','name'),help='help:')
In [295]: parser.print_help()
usage: ipython2.7 [-h] [-i url name]
optional arguments:
-h, --help show this help message and exit
-i url name, --input url name
help:
In [296]: parser.parse_args('-i one two -i three four'.split())
Out[296]: Namespace(input=[['one', 'two'], ['three', 'four']])
이는 다음을 처리하지 않습니다.2 or 3 argument
case (비록 얼마 전에 그러한 범위를 처리하는 Python 버그/문제에 대한 패치를 작성했지만).
다음과 같은 별도의 인수 정의는 어떻습니까?nargs=3
그리고.metavar=('url','name','other')
?
튜플metavar
에도 사용할 수 있습니다.nargs='+'
그리고.nargs='*'
2개의 문자열은 다음과 같이 사용됩니다.[-u A [B ...]]
또는[-u [A [B ...]]]
.
이것은 간단합니다. 둘 다 추가하면 됩니다.action='append'
그리고.nargs='*'
(또는)'+'
).
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', action='append', nargs='+')
args = parser.parse_args()
그리고 나서 실행하면, 당신은
In [32]: run test.py -i input1_url input1_name input1_other_var -i input2_url i
...: nput2_name input2_other_var -i input3_url input3_name
In [33]: args.i
Out[33]:
[['input1_url', 'input1_name', 'input1_other_var'],
['input2_url', 'input2_name', 'input2_other_var'],
['input3_url', 'input3_name']]
-i
3개의 인수를 허용하고 를 사용하도록 구성해야 합니다.append
액션.
>>> p = argparse.ArgumentParser()
>>> p.add_argument("-i", nargs=3, action='append')
_AppendAction(...)
>>> p.parse_args("-i a b c -i d e f -i g h i".split())
Namespace(i=[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']])
선택적 값을 처리하기 위해 간단한 사용자 지정 유형을 사용할 수 있습니다.이 경우, 주장은 다음과 같습니다.-i
는 쉼표로 구분된 단일 문자열이며 분할 수는 2로 제한됩니다.두 개 이상의 값이 지정되었는지 확인하려면 값을 후처리해야 합니다.
>>> p.add_argument("-i", type=lambda x: x.split(",", 2), action='append')
>>> print p.parse_args("-i a,b,c -i d,e -i g,h,i,j".split())
Namespace(i=[['a', 'b', 'c'], ['d', 'e'], ['g', 'h', 'i,j']])
자세한 제어를 위해 사용자 지정 작업을 정의합니다.이것은 내장된 기능을 확장합니다._AppendAction
(에 의해 사용됨)action='append'
), 하지만 단지 주어진 인수의 수에 대한 범위 검사를 합니다.-i
.
class TwoOrThree(argparse._AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
if not (2 <= len(values) <= 3):
raise argparse.ArgumentError(self, "%s takes 2 or 3 values, %d given" % (option_string, len(values)))
super(TwoOrThree, self).__call__(parser, namespace, values, option_string)
p.add_argument("-i", nargs='+', action=TwoOrThree)
이 쓰레드에서 기타와 함께 추가하고 있습니다.
사용하는 경우action='append'
에add_argument()
그러면 옵션을 추가할 때마다 목록 내의 목록에 있는 인수를 얻을 수 있습니다.
원하는 대로:
[
["input1_url", "input1_name", "input1_other"],
["input2_url", "input2_name", "input2_other"],
["input3_url", "input3_name"]
]
하지만 같은 주장을 원하는 사람이 있다면,list[]
그 다음에 사용action='extend'
대신에action='append'
당신의 코드로.이렇게 하면 이러한 인수가 단일 목록에 표시됩니다.
[
"input1_url",
"input1_name",
"input1_other",
"input2_url",
"input2_name",
"input2_other",
"input3_url",
"input3_name"
]
언급URL : https://stackoverflow.com/questions/36166225/using-the-same-option-multiple-times-in-pythons-argparse
'programing' 카테고리의 다른 글
소수점 이하가 예상되는 경우 MariaDB 사용자 정의 함수가 int 또는 null을 반환합니다. (0) | 2023.07.27 |
---|---|
PyQt 응용 프로그램에서 스레드화:Qt 스레드 또는 Python 스레드를 사용합니까? (0) | 2023.07.27 |
서비스에서 컨텍스트 가져오기 (0) | 2023.07.27 |
개별 클래스 이름에 '시작' 선택기 사용 (0) | 2023.07.27 |
Oracle은 공백 앞에 하위 문자열을 가져옵니다. (0) | 2023.07.27 |