我想要表格上的程序:
program {a|b|c <foo>} [--config <file>]
必须提供a,b和c中的一个,如果使用c,则必须提供foo参数,否则不可以。
所以这些应该被接受的呼叫:
program a
program c hello
program a --config file.conf
program b --config file.conf
program --config file.conf b
program c haha --config file.conf
但是我想禁止这些]
program a haha program b haha --config file.conf
最好,我也想禁止这个,但这不是很重要
program c --config file.conf hello
即,不允许将config参数放在两者之间。
这是我当前的代码:
import argparse parser=argparse.ArgumentParser(description='My prog') parser.add_argument('command', type=str, choices=['a', 'b', 'c']) parser.add_argument('foo', type=str) parser.add_argument('--config', type=str)
此“工作方式”很好,但是如果
foo
,我希望command='c'
参数是必需的,否则则不允许,并且我找不到解决方法。现在,我需要为foo提供一些虚拟参数。
我想要一个程序,形式为:程序{a | b | c
使a
,b
和c
子命令而不是普通的位置参数。在这里,不是将--config
显式添加到每个子解析器中,而是使用parents
关键字参数在一个单独的解析器中为要继承的每个子解析器定义了它。
import argparse
parser=argparse.ArgumentParser(description='My prog')
subparsers = parser.add_subparsers(dest='command')
config_parser = argparse.ArgumentParser(add_help=False)
config_parser.add_argument('--config')
ap = subparsers.add_parser('a', parents=[config_parser])
bp = subparsers.add_parser('b', parents=[config_parser])
cp = subparsers.add_parser('c', parents=[config_parser])
cp.add_argument("foo")
print(parser.parse_args())