使用水泥的多个非标记参数

时间:2014-06-24 20:30:34

标签: python command-line-interface

我正在cement之上编写一个python命令行界面工具。 水泥对于标准参数解析非常有效。但是,我希望能够添加特定数量的非标记参数。让我解释一下。

典型的命令行工具:

cmd subcmd -flag -stored=flag

现在,假设我想添加一些没有标志的参数,例如cd如何工作

cd my/dir

my/dir是一个没有旗帜的论据。

无论如何用水泥做到这一点?

我当前的示例水泥应用程序:

# define application controllers
class MyAppBaseController(controller.CementBaseController):
    class Meta:
        label = 'base'
        interface = controller.IController
        description = "My Application Does Amazing Things"
        arguments = [
            (['--base-opt'], dict(help="option under base controller")),
            ]

    @controller.expose(help="base controller default command", hide=True)
    def default(self):
        self.app.args.parse_args(['--help'])
        print "Inside MyAppBaseController.default()"

    @controller.expose(help="another base controller command")
    def command1(self):
        print "Inside MyAppBaseController.command1()"

所以我想说我想做myapp command1 some/dir some_string

有没有办法解析这些参数?

2 个答案:

答案 0 :(得分:13)

您可以使用ArgParse中的可选位置参数执行此操作。实际上GitHub中存在一个问题,可以更好地记录这个主题:

https://github.com/datafolklabs/cement/issues/256

基本上,如果你想要“command1”来处理操作,那么“some / dir some_string”将是位置参数。您可以将以下内容添加到MyAppBaseController.Meta.arguments:

( ['extra_arguments'], dict(action='store', nargs='*') ),

然后在command函数中访问这些参数:

if self.app.pargs.extra_arguments: print "Extra Argument 0: %s" % self.app.pargs.extra_arguments[0] print "Extra Argument 1: %s" % self.app.pargs.extra_arguments[1]

答案 1 :(得分:1)

正如水泥doc中所述:"水泥定义了一个名为IArgument的参数接口,以及实现该接口的默认ArgParseArgumentHandler。此处理程序构建在ArgParse模块之上,该模块包含在Python标准库中。

您可以通过告诉argparse模块从参数列表中使用一个参数并将其存储在pargs列表的name属性中来实现此目的。

# define application controllers
class MyAppBaseController(controller.CementBaseController):
    class Meta:
        label = 'base'
        interface = controller.IController
        description = "My Application Does Amazing Things"
        arguments = [
            (['--base-opt'], dict(help="option under base controller")),
        ]

    @controller.expose(help="base controller default command", hide=True)
    def default(self):
        self.app.args.parse_args(['--help'])
        print "Inside MyAppBaseController.default()"

    @controller.expose(
        help="another base controller command",
        arguments=[
            (['path'],
             dict(type=str, metavar='PATH', nargs='?', action='store', default='.')),
            (['string'],
             dict(type=str, metavar='STRING', nargs='?', action='store', default='')),
        ]
    )
    def command1(self):
        print "Inside MyAppBaseController.command1() path: %s string: %s" % (self.app.pargs.name, self.app.pargs.string)