当前位置: 首页 > 面试题库 >

如何将每个包含一组子命令的Click命令拆分为多个文件?

归泽宇
2023-03-14
问题内容

我已经开发了一个大型点击应用程序,但是浏览不同的命令/子命令变得很困难。如何将命令组织到单独的文件中?是否可以将命令及其子命令组织到单独的类中?

这是一个我想如何分开的例子:

在里面

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此功能的缺点是它会合并您的命令,并且仅适用于命令组。imho更好的替代方法是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类和模块的全部功能。

Mycli.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)

通过此设置,可以很容易地按关注点分离命令,并围绕它们构建可能需要的其他功能。到目前为止,它对我非常有用…

参考:http :
//click.pocoo.org/6/quickstart/#nesting-
commands



 类似资料:
  • 我有一个名为MovieID_NameID_Roles.txt的文件,容量为1,767,605 KB。 我需要遍历它来解析,然后填充数据库表。 我想处理几个小文件,而不是一个大文件,我找到了如何分割大文本文件的答案。 基于接受的答案,其中指出: 分成每行10000行的文件:拆分myLargeFile.txt-l 10000 ...但是在第二个屏幕截图的底部,给出了这个命令的一个在我看来更“花哨”的版

  • 本文向大家介绍每天一个linux命令之locate 命令,包括了每天一个linux命令之locate 命令的使用技巧和注意事项,需要的朋友参考一下 locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 c

  • 问题内容: 我想将命令的每个输出作为多个参数传递给第二个命令,例如: 返回: 我想复制这些输出,例如: 我该怎么做呢?就像是: 问题答案: 您可以使用:

  • 问题内容: 我试图弄清楚如何使用argparser执行以下操作: 本身是一个子命令。我的目标是使脚本具有链接一系列子命令(成为其中一个命令)并按顺序执行它们的能力。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。如何使用argparse完成此操作?我尝试了以下方法: 但是,似乎每次执行此操作时,它都会进入子命令并报告它不知道是什么。我尝试解析额外的内容,以便可以执行重复调用/链,但是

  • 问题内容: 类似于C#的该线程,我需要拆分一个包含命令行参数的字符串到我的程序中,这样我才能允许用户轻松地运行多个命令。例如,我可能具有以下字符串: 鉴于以上所述,Java通常会将以下内容传递给main: 我不需要担心任何shell扩展,但是它必须足够聪明以处理单引号和双引号以及字符串中可能存在的任何转义符。在这种情况下,有人知道像shell一样解析字符串的方法吗? 注 :我 不是 需要做的命令行

  • 问题内容: 我正在用Python编写一个程序,该程序必须通过SSH与物理目标进行通信,并自动将一些命令发送到该目标(用于测试)。 我首先使用Paramiko进行此操作,然后一切都非常完美,直到我必须发送几个命令,并且例如当第二个命令必须在第一个命令的上下文中执行时(例如,第一个命令执行,第二个命令是)。我不能这样做,因为每个人都开始一个新的会话。 我尝试使用带有的通道,但是与此相关的另一个问题是: