2

我想开发一个命令行程序,可以处理并为子命令提供“帮助”。具体来说,假设我有一个名为“cgent”的脚本,我想让子命令“abc”、“def”和“xyz”执行并接受 sys.args 的其余部分以供 optparse 处理。

cgent abc [选项]
cgent 帮助 abc
……

如果我对子命令名称进行硬编码,所有这些都很简单。但是,我希望能够通过添加类或模块(?)来继续添加子命令。例如,这类似于 Web 框架用于添加控制器的想法。我尝试过挖掘塔架,看看我是否可以重新创建那里所做的事情,但我还没有解开逻辑。关于如何做到这一点的任何建议?

谢谢,肖恩

4

2 回答 2

4

如果您不必对参数进行复杂的解析,我推荐使用baker模块。它允许您通过装饰器定义子命令及其参数。例如:

#!/usr/bin/env python
import baker

@baker.command()
def foo(a=1):
    print 'foo:', a

@baker.command()
def baz(b=1):
    print 'baz:', b

baker.run()

定义两个子命令foobaz,带有(可选)参数ab。所以你可以像这样使用它们:

$ ./test_baker.py foo --a 2
foo: 2
$ ./test_baker.py baz
baz: 1

它还使用文档字符串来生成帮助。

由于baker模块是全局的,您的子命令可以跨越多个.py文件。只要导入它们,子命令就会自动注册。

此外,它只是一个.py文件,因此您可以将其放入源代码树中。

于 2011-01-09T23:05:04.047 回答
1

您必须创建一个“命令注册表”。这可以像字典一样简单。

在主程序中,您执行以下操作:

commands = {}

在您添加的任何子模块中

from yourmodule.main import commands

def mynewcommand(arguments=here):
    pass

commands['newcommand'] = mynewcommand

然后您可以使用 argparse 来处理命令。在这种情况下,您的模块也需要为命令添加子解析器部分。

于 2011-01-09T22:55:07.053 回答