Python Cement CLI-在给出无效参数的情况下打印子解析器的帮助

问题描述 投票:0回答:1

我正在使用Python 3.7和Cement 3.0.4。

我拥有的是带有控制器的基本应用程序,并且该控制器具有一个使用单个可选参数的命令。我所看到的是,如果我通过命令传递了一个无效的参数,则会收到一个无效的参数错误,这与预期的一样,但是我正在获取应用程序本身的“使用情况”输出,而不是控制器上的命令。这是一个例子:

from cement import App, Controller, ex

class Base(Controller):
    class Meta:
        label = 'base'


    @ex(help='example sub-command')
    def cmd1(self):
        print('Inside Base.cmd1()')

    @ex(
        arguments=[
            (['-n', '--name'],
             {'help': ''': The name you want printed out''',
              'dest': 'name',
              'required': False}),
            ],
        help=' the help for cmd2.')
    def cmd2(self):
        print(self.app.pargs.name)

此应用程序有一个名为cmd2的命令,它带有一个可选参数-n,作为帮助状态,该参数将被打印出来。因此,如果我这样做:

with MyApp(argv=['cmd2', '-n', 'bob']) as app:
    app.run()

我将输出:bob如预期的那样。但是,如果我将无效的参数传递给cmd2:

with MyApp(argv=['cmd2', '-a', 'bob']) as app:
    app.run()

我得到:

usage: myapp [-h] [-d] [-q] {cmd1,cmd2} ...
myapp: error: unrecognized arguments: -a bob

我想看到的是cmd2命令的用法,而不是myapp的用法,类似于我对命令执行-h的情况:

with MyApp(argv=['cmd2', '-h']) as app:
    app.run()

输出

usage: myapp cmd2 [-h] [-n NAME]

optional arguments:
  -h, --help            show this help message and exit
  -n NAME, --name NAME  : The name you want printed out

我意识到这大部分是委托给Argparse的,而不是由Cement处理的。我已经进行了一些调试,发现有多个嵌套的ArgparseArgumentHandler类。因此,在上述情况下,ArgparseArgumentHandler的名称为myapp,并且在其操作中具有SubParsersAction的字段,该字段具有choices字段,该字段的映射包含控制器上的两个命令cmd1和[C0 ]映射到自己的cmd2

[当检测到无效参数时,它在ArgparseArgumentHandler的ArgparseArgumentHandler中,因此它在myapp上调用print_usage(),而不是在调用的命令myappArgparseArgumentHandler上调用。

我对Argparse的了解有限,我的确发现导航有些复杂。我现在能想到的唯一解决方法是子类化cmd2,并重写ArgparseArgumentHandler并尝试确定错误是否是由于可识别的参数引起的,如果是,则尝试为它找到解析器..类似此伪代码的内容:] >

error()

上面同样是伪代码,实际上这样做会感到非常脆弱,容易出错且不可预测。我知道必须有一种更好的方法来做到这一点,但我只是没有找到它。我已经研究了数小时的文档和资源,但仍然没有找到我想要的东西。谁能告诉我我所缺少的吗?任何有关如何进行此处的建议,将不胜感激。非常感谢!

我正在使用Python 3.7和Cement 3.0.4。我所拥有的是带有控制器的基本应用程序,该控制器具有一个带有单个可选参数的命令。我所看到的是,如果我通过命令...

python python-3.x argparse cement
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.