2014-06-13 1 views
3

두 개의 하위 구문 분석기를 사용하여 주 구문 분석기를 설정하려고 했으므로 혼자 호출 될 때 주 구문 분석기가 도움말 메시지를 표시합니다.Python 2.x optionnal subparsers - 오류가 너무 적습니다.

def help_message(): 
    print "help message" 

import argparse 
parser = argparse.ArgumentParser() 

subparsers = parser.add_subparsers(dest='sp') 

parser_a = subparsers.add_parser('a') 
parser_a.required = False 
#some options... 
parser_b = subparsers.add_parser('b') 
parser_b.required = False 
#some options.... 

args = parser.parse_args([]) 

if args.sp is None: 
    help_message() 
elif args.sp == 'a': 
    print "a" 
elif args.sp == 'b': 
    print "b" 

이 코드는 파이썬 3에서 잘 작동하고 '파이썬 myprogram.py'

myprogram.py: error: too few arguments 

을 실행할 때 나는 파이썬 2.x에서 나는이 무엇입니까

을에 aswell 일하고 싶습니다 여기에 내 질문입니다 : 어떻게 '파이썬 myprogram.py'셸에서 쓸 수 및 오류 대신 도움말 메시지를 가져올 수 있습니다.

+0

질문은 무엇을 할 수 있습니다 이름으로 -

The tutorial

옵션 인수와 필요한 인수의 차이는 ""를 추가하는 것을 보여줍니다? –

+1

필자는 선택 사항으로 표시된 하위 파서를 본 적이 없으며 문서에 지원되지 않는다고 표시되지 않습니다. 필요한 하위 명령을 생략하면 도움말 메시지가 표시되므로 선택적 하위 명령을 허용하는 것이 유용한 이유가 확실하지 않습니다. – chepner

+0

이미''argparse''에 내장 된 많은 기능을 복제하고 있습니다. 필요한 인수가 빠졌을 때 도움말 메시지를 표시하기위한 모든 기능을 이미 갖추고 있습니다. – aruisdante

답변

4

난 당신이 http://bugs.python.org/issue9253

귀하의 subparsers의 위치 인수가에서 논의 된 버그를 다루고있다 생각합니다. nargs='?' (또는 *)을 제외하고 항상 그러한 종류의 인수가 필요합니다. 나는 2.7에서 에러 메시지를받는 이유라고 생각한다.

그러나 최신 py3 릴리스에서는 필요한 인수를 테스트하는 방법이 변경되어 서브 파서가 균열을 통과했습니다. 이제 그들은 optional (필수 사항 아님)입니다. argparse이 이전처럼 작동하도록 (subparser 항목이 필요함) 제안 된 패치/퍼지가 있습니다. 결국 py3 argparse가 py2 연습으로 되돌아 갈 것으로 기대합니다 (required=False 매개 변수를 수락 할 수있는 옵션 포함).

따라서 args.sp is None을 테스트하는 대신 으로 전화하기 전에 sys.argv[1:]을 테스트 할 수 있습니다. Ipython은 자체 도움말 메시지를 생성하기 위해이 작업을 수행합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 parse_args()를 즉시 호출하지 않을 것을 고려하지 않았습니다. 새 argparse.Namespace 개체를 추가하고 sys.argv [1 :] 문제를 극복하고 말했듯이. 만약 누군가가 같은 수표를 원한다면이 [url] (http://stackoverflow.com/questions/16878315/what-is-the-treat-python-argparse-namespace-as-a-dictionary) – Lucas

0

기타 - 일반적으로 argparse를 사용하는 동안 내 스크립트를 아무런 이유없이 호출 할 수없는 이유를 알아 내려고하면서이 페이지가 끝났습니다.

parser.add_argument("--show") <--- Optional arg 
parser.add_argument("show") <--- Not optional arg 
관련 문제