我正在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
有没有办法解析这些参数?
答案 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)