3

我正在尝试使用带有子解析器的 argparse 在 3 个功能之间切换,而一个位置参数应该对所有子解析器都是通用的。此外,这是关键点,我想将位置参数作为提供的最后一个参数,因为这个参数是输出文件路径。把它放在开头对我来说毫无意义(作为第一个论点)

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 命令时更有意义,因为我需要传递其他参数值。例如:

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

如何设置 argparse 以具有这种行为?

4

2 回答 2

0

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

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

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

通过定义的位置parents将首先放置。因此,如果 'outfile' 必须是最后一个,则必须为每个子解析器单独定义它。

它也可以最后指定为主解析器的位置(在子解析器定义之后)。

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被解释为子解析器选择。 test被子解析器解释为位置。 out剩下的,并返回到主解析器以在它认为合适的时候使用。如果子解析器不返回任何额外内容,则此解析可能会出错。所以我会警惕指定这样的最终位置。

于 2014-04-08T23:54:31.767 回答
0

您无需指定files为 的父级parser,只需为每个子解析器指定。

于 2014-04-08T20:43:06.600 回答