필요한 하위 구문 분석기를 사용한 인수 구문 분석
파이썬 3.4를 사용하고 있습니다.argparse
하위 파서와 함께, 그리고 저는 Python 2.x에서 (하위 파서/하위 프로그램을 나타내는) 위치 인수를 제공하지 않으면 유용한 오류 메시지가 표시되는 것과 유사한 동작을 하고 싶습니다.예를 들어, 와python2
다음 오류 메시지가 표시됩니다.
$ python2 subparser_test.py
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
내가 설정하는 중입니다.required
그러나 https://stackoverflow.com/a/22994500/3061818, 에서 제안한 속성은 Python 3.4.0에서 오류를 제공합니다.TypeError: sequence item 0: expected str instance, NoneType found
전체 추적:
$ python3 subparser_test.py
Traceback (most recent call last):
File "subparser_test.py", line 17, in <module>
args = parser.parse_args()
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
args, argv = self.parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args
', '.join(required_actions))
TypeError: sequence item 0: expected str instance, NoneType found
이것은 나의 프로그램입니다.subparser_test.py
https://docs.python.org/3.2/library/argparse.html#sub-commands 에서 수정됨:
import argparse
# sub-command functions
def foo(args):
print('"foo()" called')
# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.required = True
# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.set_defaults(func=foo)
args = parser.parse_args()
args.func(args)
관련 질문:왜 이 argparse 코드는 Python 2와 3 사이에서 다르게 작동합니까?
당신은 주어야 합니다.subparsers
a dest
.
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True
이제:
1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] {foo} ...
stack23349349.py: error: the following arguments are required: cmd
이 '인수 누락' 오류 메시지를 표시하려면 코드에서 해당 인수에 이름을 지정해야 합니다.위치 인수(하위 구문 분석 등)의 경우 해당 이름이 (기본적으로) 'dest'입니다.링크하신 SO 답변에 이에 대한 (단조) 메모가 있습니다.
에 대한 몇 안 되는 '패치' 중 하나.argparse
마지막 Python 릴리스에서는 '필수' 인수를 테스트하는 방법이 변경되었습니다.안타깝게도 하위 파서와 관련하여 이 버그가 발생했습니다.이 문제는 다음 릴리스에서 해결해야 합니다(더 빠르지 않은 경우).
갱신하다
Py2에서 선택적인 하위 파서 동작을 원한다면, 에서 설명한 것처럼 2단계 파서를 사용하는 것이 가장 좋은 옵션인 것 같습니다.
Argparse Module with Python 2.7을 사용하여 기본 하위 파서를 설정하는 방법
관련 버그/문제에 최근 몇 가지 활동이 있습니다.
https://bugs.python.org/issue9253
갱신하다
이에 대한 수정 작업이 진행 중입니다. https://github.com/python/cpython/pull/3027
앞에서 언급한 해결 방법은 더 이상 필요하지 않습니다.add_mutually_exclusive_group()
메서드는 필수 인수도 허용합니다.
이는 상호 배타적 인수 중 하나 이상이 필요함을 나타냅니다.
parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')
> parser.parse_args([])
> usage: PROG [-h] (--foo | --bar)
> PROG: error: one of the arguments --foo --bar is required
argsparse 문서에서 가져온 것: https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group
언급URL : https://stackoverflow.com/questions/23349349/argparse-with-required-subparser
'programing' 카테고리의 다른 글
급여표에서 세 번째 또는 네 번째 최대 급여를 찾는 방법은 무엇입니까? (0) | 2023.05.21 |
---|---|
Visual Studio에서 zure 함수를 게시하는 동안 오류 발생 (0) | 2023.05.21 |
package.json에 없는 패키지의 node_modules 폴더를 정리하는 방법은 무엇입니까? (0) | 2023.05.21 |
Crbug/1173575, 비 JS 모듈 파일은 더 이상 사용되지 않습니다.chrome webdata/ (인덱스) ꞉5305:9:5551 (0) | 2023.05.16 |
Windows에서 배치 스크립트의 경로를 가져오는 방법은 무엇입니까? (0) | 2023.05.16 |