2012-01-16 35 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實現這一點,但是當沒有提供操作字符串它不打印的幫助,它只是失敗的所有醜陋如:

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'?不知怎的,'__init.py__'作爲第一個參數提供,就好像你在調用'python __init__.py __init __。py'。 – unutbu 2012-01-16 23:37:45

+0

你是怎麼調用'parser.parse_args()'?如果我說'parser.parse_args(['start'])',我得到一個'Namespace'對象。 – chepner 2012-01-16 23:38:35

回答

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 

一個提示,如果你在構造函數指定「前衛」你使用初始化的.py作爲文件名

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'而不是'sys.argv [1:]'。 – 2012-01-17 15:52:59

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 2017-11-20 07:37:30