带有Python argparse的默认命令
, 处理sub命令的一种特别有效的方法是将add_subparsers()方法的使用与set_defaults()的调用结合起来 我想实现一些命令,比如foo和bar,其中foo是默认命令。最简单的方法是什么?这些命令具有共享和非共享的参数和选项。默认的foo命令只有选项,没有参数 所需的命令行和输出:带有Python argparse的默认命令,python,argparse,Python,Argparse,, 处理sub命令的一种特别有效的方法是将add_subparsers()方法的使用与set_defaults()的调用结合起来 我想实现一些命令,比如foo和bar,其中foo是默认命令。最简单的方法是什么?这些命令具有共享和非共享的参数和选项。默认的foo命令只有选项,没有参数 所需的命令行和输出: $ python m.py foo $ python m.py -a foo(a) $ python m.py foo foo $ python m.py foo -a foo(a) $ pyt
$ python m.py
foo
$ python m.py -a
foo(a)
$ python m.py foo
foo
$ python m.py foo -a
foo(a)
$ python m.py bar
bar
$ python m.py bar -b
bar(b)
提前谢谢
增加:
我的代码当前是这样的:
import argparse
def a(args):
print(f'a({args})')
def b(args):
print(f'b({args})')
def main():
parser = argparse.ArgumentParser()
parser.set_defaults(func=a) # default command
sp = parser.add_subparsers()
pa = sp.add_parser('a') # subcommand
pa.set_defaults(func=a)
pa.add_argument('-p')
pa.add_argument('-q')
pb = sp.add_parser('b') # subcommand
pb.set_defaults(func=b)
pb.add_argument('-p')
pb.add_argument('-x')
args = parser.parse_args() # https://docs.python.org/ja/3/library/argparse.html#sub-commands
args.func(args)
if __name__ == "__main__":
main()
由于-p和-q是命令a的选项,默认解析器无法识别它们。如果我添加parser.add_参数('-p'),它似乎可以工作。但是,如果我通过
python m.py-p1a-p2
为主解析器和子解析器指定-p,则它是允许的,后者具有优先权。这很容易出错,我想为冲突提出一些例外。另外,如果我添加required=True
,两个解析器都需要它,解析器需要冲突,这是我想要避免的。您尝试过用两个子解析器创建ArgumentParser吗?您链接的文档中有一个非常好的例子。它还展示了如何向主解析器和子解析器添加参数。试试看,然后把你的代码贴在这里。好吧,我错过了关于默认命令的部分。argparse不允许您设置默认子解析器,因此这需要一些技巧。您可以在主解析器中使用set\u defaults
来设置func
属性。main还可以有一个'-a'参数。然后像往常一样定义“foo”和“bar”。我认为总体行为将是您所期望的(但尚未测试)。您是否尝试过创建一个包含两个子parser的ArgumentParser?您链接的文档中有一个非常好的例子。它还展示了如何向主解析器和子解析器添加参数。试试看,然后把你的代码贴在这里。好吧,我错过了关于默认命令的部分。argparse不允许您设置默认子解析器,因此这需要一些技巧。您可以在主解析器中使用set\u defaults
来设置func
属性。main还可以有一个'-a'参数。然后像往常一样定义“foo”和“bar”。我认为总体行为将符合您的预期(但尚未测试)。