Dea*_*ado 5 python argparse python-cmd
有没有一种方法可以使用argparse挂钩的模块作为继承自接口的每个提示的解释器cmd?
我想让我的cmd接口以一种典型line的方式来解释典型的参数,就像解释运行时在bash shell上传递的选项和参数一样,使用可选参数和-位置参数。
那么,一种方法是重写 的cmd方法default并使用它来解析 的行argparse,因为do_cmd.Cmd 子类中没有方法的所有命令都将失败以使用该default方法。_注意前面的附加内容do_test,避免被用作 的cmd命令。
import argparse
import cmd
import shlex
class TestCLI(cmd.Cmd):
def __init__(self, **kwargs):
cmd.Cmd.__init__(self, **kwargs)
self.parser = argparse.ArgumentParser()
subparsers = self.parser.add_subparsers()
test_parser = subparsers.add_parser("test")
test_parser.add_argument("--foo", default="Hello")
test_parser.add_argument("--bar", default="World")
test_parser.set_defaults(func=self._do_test)
def _do_test(self, args):
print args.foo, args.bar
def default(self, line):
args = self.parser.parse_args(shlex.split(line))
if hasattr(args, 'func'):
args.func(args)
else:
cmd.Cmd.default(self, line)
test = TestCLI()
test.cmdloop()
Run Code Online (Sandbox Code Playgroud)
argparse如果遇到未知命令,则执行a sys.exit,因此您需要重写或猴子修补您的ArgumentParser方法error以引发异常,而不是退出并在方法中处理该异常default,以便留在cmd的命令循环中。
我建议你研究一下cliff,它允许你编写可以自动用作asargparse和cmd命令的命令,这非常简洁。它还支持从setuptools入口点加载命令,这允许您将命令作为插件分发到您的应用程序。但请注意,它cliff使用cmd2,它是cmd更强大的表亲,但您可以替换它,cmd因为它cmd2是作为 的直接替代品开发的cmd。