在python中定义argparse参数的顺序

时间:2013-07-04 12:51:08

标签: python argparse

我正在尝试使用argparse和subparser来切换3个fonctionnalities,而一个位置参数应该对所有subparser都是通用的。而且,它是关键点,我想把位置参数作为提供的最后一个参数,因为这是一个输出文件路径。把它放在开头(作为第一个论点)对我没有意义

import sys,argparse,os

files = argparse.ArgumentParser(add_help=False)
files.add_argument('outfile',  help='output mesh file name')

parser = argparse.ArgumentParser(description="A data interpolation program.",prog='data_interpolate.py',    parents=[files])

subparsers = parser.add_subparsers(help='Mode command.')
command_parser = subparsers.add_parser('cmd',help='Pass all argument in command line.',parents=[files])
command_parser.add_argument('-min', dest='MINFILE',help='Input file with min values', required=True)
command_parser.add_argument('-max', dest='MAXFILE',help='Input file with min values', required=True)
command_parser.add_argument('u', help='Interpolation parameter. Float between 0 and 1. Out of bound values are limited to 0 or 1.')

subparsers.add_parser('py',help='Pass all argument in python file.',parents=[files])
subparsers.add_parser('json',help='Pass all argument in json file.',parents=[files])

给出了:

data_interpolation.py -h 

usage: data_interpolation.py [-h] outfile {cmd,py,json}

但是,在我看来,outfile应该在下面给出:

data_interpolation.py [-h] {cmd,py,json} outfile

使用cmd命令时更有意义,因为我需要传递其他参数值。对于intance:

data_interpolation.py cmd -min minfile.txt -max maxfile.txt 0.6 outfile.txt

如何设置argparse以获得此类行为?

2 个答案:

答案 0 :(得分:0)

您无需将files指定为parser的父级,仅适用于每个子级别。

答案 1 :(得分:0)

(注意 - 这是一个老问题)。

位置的顺序由它们的定义顺序决定。这包括subparsers参数(这是一个带有选择和特殊操作的位置)。

outfile定义为主解析器和子解析器的参数是多余的。

通过parents定义的定位将首先放置。所以,如果' outfile'必须是最后一个,必须为每个subparser单独定义。

最后也可以将其指定为主解析器的postional(在subparser定义之后)。

In [2]: p=argparse.ArgumentParser()    
In [5]: sp=p.add_subparsers(dest='cmd')
In [6]: spp=sp.add_parser('cmd1')
In [7]: spp.add_argument('test')
In [8]: p.add_argument('out')
In [9]: p.print_help()
usage: ipython [-h] {cmd1} ... out
...

In [11]: spp.print_help()
usage: ipython cmd1 [-h] test
...

In [15]: p.parse_args('cmd1 test out'.split())
Out[15]: Namespace(cmd='cmd1', out='out', test='test')

cmd1被解释为次级选择。 {sub}子将test解释为位置。 out遗留下来,并返回主解析器以便在其认为合适时使用。如果subparser没有返回任何额外内容,则此解析可能会混乱。因此,我要谨慎地指定这样的最终位置。