gpt4 book ai didi

python - 在 python 中定义 argparse 参数的顺序

转载 作者:行者123 更新时间:2023-12-05 05:27:42 28 4
gpt4 key购买 nike

我正在尝试将 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 以实现这种行为?

最佳答案

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

位置的顺序由定义它们的顺序决定。这包括 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 被遗留下来,并返回给主解析器以供它认为合适的使用。如果子解析器不返回任何额外内容,则此解析可能会搞砸。所以我会谨慎指定像这样的最终位置。

关于python - 在 python 中定义 argparse 参数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com