[python] 인수없이 스크립트를 호출하면 Python Argparse와 함께 도움말 메시지 표시

이것은 간단한 것일 수 있습니다. argparse를 사용하여 명령 줄 인수 / 옵션을 처리하는 프로그램이 있다고 가정합니다. 다음은 ‘도움말’메시지를 인쇄합니다.

./myprogram -h

또는:

./myprogram --help

그러나 인수없이 스크립트를 실행하면 아무것도하지 않습니다. 내가 원하는 것은 인수없이 호출 될 때 사용법 메시지를 표시하는 것입니다. 어떻게됩니까?



답변

이 답변은 Google 그룹의 Steven Bethard 가 제공합니다 . Google 계정이없는 사용자가 더 쉽게 액세스 할 수 있도록 여기에 다시 게시하고 있습니다.

error메소드 의 기본 동작을 대체 할 수 있습니다 .

import argparse
import sys

class MyParser(argparse.ArgumentParser):
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)

parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()

위의 솔루션은 error
메소드가 트리거 될 때마다 도움말 메시지를 인쇄합니다 . 예를 들어, 유효한 옵션이 아닌 test.py --blah경우 도움말 메시지도 인쇄합니다 --blah.

명령 행에 인수가 제공되지 않은 경우에만 도움말 메시지를 인쇄하려는 경우 여전히 가장 쉬운 방법입니다.

import argparse
import sys

parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
    parser.print_help(sys.stderr)
    sys.exit(1)
args=parser.parse_args()

참고 parser.print_help()기본적으로 표준 출력으로 인쇄합니다. init_js가 제안 했듯이 parser.print_help(sys.stderr)stderr에 인쇄하는 데 사용하십시오 .


답변

클래스를 작성하는 대신 try / except를 대신 사용할 수 있습니다.

try:
    options = parser.parse_args()
except:
    parser.print_help()
    sys.exit(0)

단점은 워크 플로가 더 명확하고 스텁 클래스가 필요 없다는 것입니다. 단점은 첫 번째 ‘사용’줄이 두 번 인쇄된다는 것입니다.

이것은 적어도 하나의 필수 주장이 필요합니다. 필수 인수가 없으면 명령 행에서 0 개의 인수를 제공하는 것이 유효합니다.


답변

argparse를 사용하면 다음을 수행 할 수 있습니다.

parser.argparse.ArgumentParser()
#parser.add_args here

#sys.argv includes a list of elements starting with the program
if len(sys.argv) < 2:
    parser.print_usage()
    sys.exit(1)


답변

스크립트를 실행하기 위해 지정해야하는 인수가있는 경우 다음 과 같이 ArgumentParser에 필요한 매개 변수를 사용하십시오 .

parser.add_argument('--foo', required=True)

인수없이 스크립트를 실행하면 parse_args ()가 오류를보고합니다.


답변

아래 add_subparsers에 언급 된 것처럼 (하위) 파서에 대한 기본 기능을 연결 하면 간단히 기본 작업으로 추가 할 수 있습니다.

parser = argparse.ArgumentParser()
parser.set_defaults(func=lambda x: parser.print_usage())
args = parser.parse_args()
args.func(args)

위치 인수가 누락되어 예외가 발생하면 try-except를 추가하십시오.


답변

가장 깨끗한 해결책은 명령 줄에 기본 인수가 없으면 수동으로 기본 인수를 전달하는 것입니다.

parser.parse_args(args=None if sys.argv[1:] else ['--help'])

완전한 예 :

import argparse, sys

parser = argparse.ArgumentParser()
parser.add_argument('--host', default='localhost', help='Host to connect to')
# parse arguments
args = parser.parse_args(args=None if sys.argv[1:] else ['--help'])

# use your args
print("connecting to {}".format(args.host))

인수없이 호출되면 완전한 도움말 (짧은 사용법이 아님)을 인쇄합니다.


답변

내 버전을 더미에 던지기 :

import argparse

parser = argparse.ArgumentParser()
args = parser.parse_args()
if not vars(args):
    parser.print_help()
    parser.exit(1)

당신은 알 수 있습니다 parser.exitsys파일에서 유일한 이유라면 가져 오기 줄을 저장하기 때문에 주로 그렇게 합니다 …