2012-01-16 4 views
1

:私はargparseでこれを実装しようとしましたが、アクション文字列が提供されていないとき、それは助けを印刷していないポジション引数がない場合はヘルプを表示しますか?私は、次のパラメータを取りますかなり単純なスクリプト作ってるん

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

を、それだけですべての醜いを失敗しています-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

あなたは、Pythonのバージョンは何を使用していますか? 2.7.1でコードを実行するとうまくいきます。

$ ./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 

一つのヒント、あなたがCTORで 'PROG' を指定する場合は、ファイル名として

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" 
) 

のinitの.pyを使用して、それを上書きすることができます。また、それ印刷の使用法ではなく、長い助け..あなたはこれを少しもっと明白にするためにこうすることができます。

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

関連する問題