我有一個python腳本,它接受一個可選的位置參數並有幾個子命令。其中一些子命令需要位置參數,有些則不需要。我嘗試使用不需要位置參數的子命令時出現了問題。考慮下面的測試文件:argparse可選的位置參數和子分析器參數
import argparse
argp = argparse.ArgumentParser()
argp.add_argument('inputfile', type=str, nargs='?',
help='input file to process')
argp.add_argument('--main_opt1', type=str,
help='global option')
subp = argp.add_subparsers(title='subcommands',
dest='parser_name',
help='additional help',
metavar="<command>")
tmpp = subp.add_parser('command1', help='command1 help')
tmpp.add_argument('pos_arg1', type=str,
help='positional argument')
print repr(argp.parse_args())
當我嘗試的第一個參數一切順利使用子command1
。
macbook-pro:~ jmlopez$ python pytest.py filename command1 otherarg
Namespace(inputfile='filename', main_opt1=None, parser_name='command1', pos_arg1='otherarg')
但現在讓我們假設command1
不需要第一個位置參數。
macbook-pro:~ jmlopez$ python pytest.py command1 otherarg
usage: pytest.py [-h] [--main_opt1 MAIN_OPT1] [inputfile] <command> ...
pytest.py: error: argument <command>: invalid choice: 'otherarg' (choose from 'command1')
我莫名其妙地被期待inputfile
設置爲None
。可以預測command1
實際上是一個子命令,因此inputfile
應該設置爲None嗎?
擁有它之前我可以使用'macbook-pro:〜jmlopez $ python pytest.py _ command1 otherarg'讓python知道輸入參數是空的。我寧願有個選項說'--cmd'來指定第一個關鍵字是一個命令,而不是它的輸入。 – jmlopez