2011-06-18 48 views
4

我試圖創建一個argparse模塊CLI,但我想有不同的參數要求不同的命令一個命令行選項,我嘗試這樣做:只有argparse

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('foo', help='foo help') 
parser.add_argument('test', nargs=1, help='test help') 
args = parser.parse_args() 

我」 D喜歡是能夠運行python test.py foopython test.py test somearg 但是當我運行python test.py foo我得到error: too few arguments。有沒有一種方法可以使命令的行爲像git status,git commitpip install?或者有沒有更好的方法來在Python中創建一個CLI?

回答

0

默認情況下,argparse參數使用一個值。如果你想讓foo有不同的行爲,你需要指定它。它看起來像你認爲默認值是nargs = 0,但它不是。從argparse文檔(位於http://docs.python.org/dev/library/argparse.html#nargs):「如果沒有提供nargs關鍵字參數,則消耗的args數量由動作決定。通常這意味着將消耗一個命令行參數,並且單個項目(不是列表)將被製作。「

您可以使用nargs ='?'對於foo並且在命令行中沒有提供任何內容的情況下給它一個默認值,或者使用非默認操作(可能是'store_true'?)。

15

@crodjer是正確的;
提供一個例子:

import argparse 
parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(title='subcommands', 
            description='valid subcommands', 
            help='additional help') 
foo_parser = subparsers.add_parser('foo', help='foo help') 
bar_parser = subparsers.add_parser('bar', help='bar help') 
bar_parser.add_argument('somearg') 
args = parser.parse_args() 

每個子分析器不同args來測試:

 
$ python subparsers_example.py bar somearg 
Namespace(somearg='somearg') 

$ python subparsers_example.py foo 
Namespace() 

$ python subparsers_example.py foo somearg 
usage: argparse_subparsers.py foo [-h] 
subparser_example.py foo: error: unrecognized arguments: somearg 

幫助輸出:

 
$ python subparsers_example.py foo -h 
usage: argparse_subparsers.py foo [-h] 

optional arguments: 
    -h, --help show this help message and exit 

$ python subparsers_example.py bar -h 
usage: argparse_subparsers.py bar [-h] somearg 

positional arguments: 
    somearg 

optional arguments: 
    -h, --help show this help message and exit 
+0

感謝您的例子! – errorhandler