Python argparse: 如何让一个初始参数决定后面有多少个参数?

Python argparse: How to make an initial parameter determine how many parameters come after?

我想执行以下操作,其中指定的 type 指示我之后可以使用的参数。

例如,对于 cmd1,我希望 param1param2

对于 cmd2,我希望 param3param4param5param6

对于 cmd3,我希望没有参数。

如果我没有指定预期的参数,应该显示错误。


此外,我是否可以通过某种方式让发出 -h 显示允许的不同组合?

在所有情况下,都可以指定其他标记,例如 --id 5--config 1

python 的 argparse 是否可行?

python test.py --type cmd1 param1 param2 --id 5

python test.py --config 2 --type cmd2 param3 param4 param5 param6

python test.py --type cmd3 --config 1

我相信您应该可以使用 nargs。例如:

parser.add_argument('--cmd1', nargs=2)  # expects 2 parameters for this argument

nargs 会将参数保存到列表中(即使您将其设置为 1!)。甚至还有一些特殊字符可以用于 nargs,例如 nargs='?'获取不确定数量的参数。

这应该有效:

parser.add_argument("--cmd1",nargs=2)
args = parser.parse_args()
print(args.cmd1)

和运行它:

>>> py parser.py --cmd1 onlyoneargument
usage: RecFcs.py [-h] [--cmd1 CMD1 CMD1]
RecFcs.py: error: argument --cmd1: expected 2 arguments

如果我们提供 2 个参数

>>> py parser.py --cmd1 one two
["one","two"]

这种子命令的使用将获得您想要的大部分内容。阅读文档以获取解释

#python test.py --type cmd1 param1 param2 --id 5
#python test.py --config 2 --type cmd2 param3 param4 param5 param6
#python test.py --type cmd3 --config 1

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--config', type=int)
parser.add_argument('--id', type=int)
sp = parser.add_subparsers(dest='type', required=True)
sp1 = sp.add_parser('cmd1')
sp1.add_argument('param1')
sp1.add_argument('param2')
sp2 = sp.add_parser('cmd2')
sp2.add_argument('parame1')
# etc
sp3 = sp.add_parser('cmd3')

args = parser.parse_args()
print(args)

测试用例

1535:~/mypy$ python3 stack70763135.py -h
usage: stack70763135.py [-h] [--config CONFIG] [--id ID] {cmd1,cmd2,cmd3} ...

positional arguments:
  {cmd1,cmd2,cmd3}

optional arguments:
  -h, --help        show this help message and exit
  --config CONFIG
  --id ID

1535:~/mypy$ python3 stack70763135.py --id 5 cmd1 foo1 foo2
Namespace(config=None, id=5, param1='foo1', param2='foo2', type='cmd1')
1535:~/mypy$ python3 stack70763135.py --config 2 cmd2 foo1
Namespace(config=2, id=None, parame1='foo1', type='cmd2')
1536:~/mypy$ python3 stack70763135.py --config 3 cmd3
Namespace(config=3, id=None, type='cmd3')

帮助可能比您想要的更零散,但信息就在那里。

idconfig 必须在 cmd 条目之前。