我已经开发了一个大型点击应用程序,但浏览不同的命令/子命令变得很困难。如何将我的命令组织到单独的文件中?是否可以将命令及其子命令组织到单独的类中?
这是我想如何将其分开的示例:
初始化
import click
@click.group()
@click.version_option()
def cli():
pass #Entry Point
command_cloudflare.py
@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
command_uptimerobot.py
@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
的缺点是它会合并您的命令并且仅适用于命令组。恕我直言,更好的选择是使用 add_command
来实现相同的结果。
我有一个包含以下树的项目:
cli/
├── __init__.py
├── cli.py
├── group1
│ ├── __init__.py
│ ├── commands.py
└── group2
├── __init__.py
└── 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 类和模块的全部功能。
我的 cli.py
是整个 CLI 的入口点:
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)
使用此设置,可以很容易地按关注点分隔命令,并围绕它们构建他们可能需要的附加功能。到目前为止,它对我很有帮助...
关于python - 如何将每个带有一组子命令的 Click 命令拆分为多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34643620/