Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Python argparse的默认命令_Python_Argparse - Fatal编程技术网

带有Python argparse的默认命令

带有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

,

处理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)
$ 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”。我认为总体行为将符合您的预期(但尚未测试)。