2012-01-16 3 views
1

나는 다음과 같은 매개 변수 걸리는 매우 간단한 스크립트를 만들고있어 :위치 지정 인수가 없으면 도움말을 인쇄 하시겠습니까?

-p --port integer, optional, default 5050 
-f --fork boolean, optional, default False 
action string, required, needs to be either start or stop 

내가 argparse이 구현하려고했습니다,하지만 액션 문자열이 제공되지 때 도움이 프린트되지 않는, 그냥 모든 추한 실패 있어요 -like :

usage: __init__.py [-h] [-p PORT] [-f] {start,stop} 
__init__.py: error: argument action: invalid choice: '__init__.py' (choose from 'start', 'stop') 

"시작"또는 "중지"를 전달해도 동일한 메시지가 표시됩니다. 여기 내 코드 :

parser = argparse.ArgumentParser(description="Start or stop the server.", 
    epilog="If you don't know what you're doing, run. Run for your life.\n") 
parser.add_argument("-p", "--port", type=int, nargs=1, default=5050, 
    dest="port", help="The port to run the server on.") 
parser.add_argument("-f", "--fork", action="store_true", default=False, 
    dest="fork", help="Fork to background? Default is false.") 
parser.add_argument("action", type=str, choices=("start","stop"), help="Whether to 'start' or 'stop' the server.") 

내가 뭘 잘못하고 있니? 바라건대 내 의도는 내 코드에서 꽤 분명하다.

+0

어떻게'__init __. py'를 호출합니까? 'python __init__.py __init __. py'를 호출하는 것처럼, 왠지 __init.py__가 첫 번째 인수로 제공되고 있습니다. – unutbu

+0

'parser.parse_args()'를 어떻게 호출할까요? 'parser.parse_args ([ 'start'])'라고 말하면'Namespace' 객체가 반환됩니다. – chepner

답변

1

사용하는 파이썬의 버전은 무엇? 2.7.1로 코드를 실행하면 정상적으로 작동합니다. 당신의 ctor에서 '음식물'를 지정하면

$ ./t stop 
$ ./t start 
$ ./t -f start 
$ ./t -f stop 
$ ./t -f 
usage: someprog [-h] [-p PORT] [-f] {start,stop} 
someprog: error: too few arguments 
$ ./t -f -p 8080 
usage: someprog [-h] [-p PORT] [-f] {start,stop} 
someprog: error: too few arguments 
$ ./t -f -p 8080 start 

하나의 팁은, 당신은 인쇄 사용 아니지만,

parser = argparse.ArgumentParser(
    prog="someprog", 
    description="Start or stop the server.", 
    epilog="If you don't know what you're doing, run. Run for your life.\n" 
) 

또한 파일 이름으로 초기화를 평을 사용하여 대체 할 수 있습니다 긴 도움 .. 당신이 일을 좀 더 명백하게하기 위해 이렇게 할 수 있습니다 ..

try: 
    parser.parse_args() 
except Exception e: 
    print "************************" 
    parser.print_help() 
    print "************************" 
+1

제 잘못,'sys.argv [1 :] '대신'sys.argv'를 전달했습니다. –

2

잘못된 인수가 제공되면 argparse module은 사용법 메시지를 인쇄하고 문제에 대한 설명을 작성한 다음 종료합니다.이 경우 사용자의 사례에서 정확히 무엇이 일어나고 있는지를 알 수 있습니다.

대신 도움말 메시지를 인쇄하려면이 사례를 직접 처리해야합니다. 예를 들어,이 코드는 더 액션이 제공되지되는 경우에 도움말 메시지를 출력 할 것이다 : 나는 아무 조치 이것을 실행하면

parser = argparse.ArgumentParser(description="Start or stop the server.", 
    epilog="If you don't know what you're doing, run. Run for your life.\n", 
    prog="myserver") 
parser.add_argument("-p", "--port", type=int, nargs=1, default=5050, 
    dest="port", help="The port to run the server on.") 
parser.add_argument("-f", "--fork", action="store_true", default=False, 
    dest="fork", help="Fork to background? Default is false.") 
parser.add_argument("action", nargs="?", type=str, choices=("start","stop"), 
    help="Whether to 'start' or 'stop' the server.") 

args = parser.parse_args() 
if args.action is None: 
    parser.print_help() 
    sys.exit(1) 

, 내가 얻을 :

$ python s.py 
usage: myserver [-h] [-p PORT] [-f] [{start,stop}] 

Start or stop the server. 

positional arguments: 
    {start,stop}   Whether to 'start' or 'stop' the server. 

optional arguments: 
    -h, --help   show this help message and exit 
    -p PORT, --port PORT The port to run the server on. 
    -f, --fork   Fork to background? Default is false. 

If you don't know what you're doing, run. Run for your life. 

그러나, 나는이를 실행하는 경우 잘못된 행동, 또는 잘못된 인수로, 다음은 argparse 모듈의 의도 된 행동으로 되돌아갑니다 :

$ python s.py not_valid 
usage: myserver [-h] [-p PORT] [-f] [{start,stop}] 
myserver: error: argument action: invalid choice: 'not_valid' (choose from 'start', 'stop') 
+0

잘못된 조치 또는 잘못된 인수와 함께 실행될 때 도움말을 인쇄 할 수 있습니까? – CyberMew