Python argparse: 如何让一个初始参数决定后面有多少个参数?
Python argparse: How to make an initial parameter determine how many parameters come after?
我想执行以下操作,其中指定的 type
指示我之后可以使用的参数。
例如,对于 cmd1
,我希望 param1
和 param2
。
对于 cmd2
,我希望 param3
、param4
、param5
和 param6
。
对于 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')
帮助可能比您想要的更零散,但信息就在那里。
id
和 config
必须在 cmd
条目之前。
我想执行以下操作,其中指定的 type
指示我之后可以使用的参数。
例如,对于 cmd1
,我希望 param1
和 param2
。
对于 cmd2
,我希望 param3
、param4
、param5
和 param6
。
对于 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')
帮助可能比您想要的更零散,但信息就在那里。
id
和 config
必须在 cmd
条目之前。