我正在尝试使用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以获得此类行为?
答案 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没有返回任何额外内容,则此解析可能会混乱。因此,我要谨慎地指定这样的最终位置。