我有一个Python脚本,它接受一个可选的位置参数并有一些子命令。其中一些子命令需要位置参数,而其他一些则不需要。当我尝试使用不需要位置参数的子命令时,出现了问题。请考虑以下测试文件:
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
。是否有办法让argparse
预测command1
实际上是一个子命令,因此应将inputfile
设置为None?
sys.argv
,并在需要时插入默认输入文件或默认命令,然后让argparse
完成其工作。 - jmlopezsubcommands
之前出现inputfile
很重要吗?通常(例如像git
这样的程序),子解析器是第一个位置参数。如果inputfile
由command1
以特殊方式处理,我希望将其命名为命令行的末尾附近。 - hpauljoptional
(标记)参数,以拆分positional
字符串列表。 - hpaulj