我已经开发了一个大型点击应用程序,但是浏览不同的命令/子命令变得很困难。如何将命令组织到单独的文件中?是否可以将命令及其子命令组织到单独的类中?
这是一个我想如何分开的例子:
import click @click.group() @click.version_option() def cli(): pass #Entry Point
@cli.group() @click.pass_context def cloudflare(ctx): pass @cloudflare.group('zone') def cloudflare_zone(): pass @cloudflare_zone.command('add') @click.option('--jumpstart', '-j', default=True) @click.option('--organization', '-o', default='') @click.argument('url') @click.pass_obj @__cf_error_handler def cloudflare_zone_add(ctx, url, jumpstart, organization): pass @cloudflare.group('record') def cloudflare_record(): pass @cloudflare_record.command('add') @click.option('--ttl', '-t') @click.argument('domain') @click.argument('name') @click.argument('type') @click.argument('content') @click.pass_obj @__cf_error_handler def cloudflare_record_add(ctx, domain, name, type, content, ttl): pass @cloudflare_record.command('edit') @click.option('--ttl', '-t') @click.argument('domain') @click.argument('name') @click.argument('type') @click.argument('content') @click.pass_obj @__cf_error_handler def cloudflare_record_edit(ctx, domain): pass
@cli.group() @click.pass_context def uptimerobot(ctx): pass @uptimerobot.command('add') @click.option('--alert', '-a', default=True) @click.argument('name') @click.argument('url') @click.pass_obj def uptimerobot_add(ctx, name, url, alert): pass @uptimerobot.command('delete') @click.argument('names', nargs=-1, required=True) @click.pass_obj def uptimerobot_delete(ctx, names): pass
使用CommandCollection此功能的缺点是它会合并您的命令,并且仅适用于命令组。imho更好的替代方法是add_command用于获得相同的结果。
CommandCollection
add_command
我有一个带有以下树的项目:
cli/ ├── __init__.py ├── cli.py ├── group1 │ ├── __init__.py │ ├── commands.py └── group2 ├── __init__.py └── commands.py
每个子命令都有其自己的模块,这使使用更多帮助程序类和文件甚至管理复杂的实现变得异常简单。在每个模块中,commands.py文件均包含@click注释。范例group2/commands.py:
commands.py
@click
group2/commands.py
import click @click.command() def version(): """Display the current version.""" click.echo(_read_version())
如有必要,您可以轻松地在模块中创建更多类,并import在此处使用它们,从而使CLI拥有Python类和模块的全部功能。
import
Mycli.py是整个CLI的入口点:
cli.py
import click from .group1 import commands as group1 from .group2 import commands as group2 @click.group() def entry_point(): pass entry_point.add_command(group1.command_group) entry_point.add_command(group2.version)
通过此设置,可以很容易地按关注点分离命令,并围绕它们构建可能需要的其他功能。到目前为止,它对我非常有用…
参考:http : //click.pocoo.org/6/quickstart/#nesting- commands