argparse optional positional argument and subparsers arguments
我有一个python脚本,它接受一个可选的位置参数,并有几个子命令。其中一些子命令需要位置参数,有些则不需要。当我尝试使用不需要位置参数的子命令时,会出现问题。考虑以下测试文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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()) |
当我试图在第一个参数中使用子命令
1 2 | macbook-pro:~ jmlopez$ python pytest.py filename command1 otherarg Namespace(inputfile='filename', main_opt1=None, parser_name='command1', pos_arg1='otherarg') |
但是现在让我们假设
1 2 3 | 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') |
不知怎的,我希望江户十一〔二〕定为江户十一〔三〕定。
型
对于
当
使用
您可以将第一个位置更改为可选的,
或者你可以选择
编辑
"欺骗"argparse将第一个位置识别为子排序器的一种方法是在其后面插入一个可选的。在
1 2 3 4 5 6 7 8 9 | p=argparse.ArgumentParser() p.add_argument('file',nargs='?',default='foo') sp = p.add_subparsers(dest='cmd') spp = sp.add_parser('cmd1') spp.add_argument('subfile') spp.add_argument('-b') p.parse_args('cmd1 -b x three'.split()) # Namespace(b='x', cmd='cmd1', file='foo', subfile='three') |
。
这里的问题是,
型
您需要告诉解析器第一个参数是不同的类型。尝试添加标志选项和默认的
1 2 | argp.add_argument('-i','--inputfile', type=str, nargs='?', help='input file to process',default=None) |
现在,您需要在inputfile参数之前添加
1 2 | macbook-pro:~ jmlopez$ python pytest.py -i filename command1 otherarg Namespace(inputfile='filename', main_opt1=None, parser_name='command1', pos_arg1='otherarg') |
号
和
1 2 | macbook-pro:~ jmlopez$ python pytest.py command1 otherarg Namespace(inputfile=None, main_opt1=None, parser_name='command1', pos_arg1='otherarg') |