【问题标题】:How would I structure a kubectl-like CLI with python-click?如何使用 python-click 构建类似 kubectl 的 CLI?
【发布时间】:2020-06-29 14:40:07
【问题描述】:

我想创建一个以kubectl 方式接收操作和资源参数的 CLI。例如。

myctl init config
myctl create issue|pr|branch
myctl delete issue|pr|branch|config

myctl 命令应该始终接收 2 个参数,这样用户就不会尝试类似:myctl init config delete issue。也不应该能够执行不可能的组合,例如myctl create config

我想到了一些类似的代码:

import click

@click.command()
@click.group()
@click.option(
    "init,create,delete",
    type=str,
    help="Action name.",
)
@click.option(
    "config,issue,pr,branch",
    type=str,
    help="Resource name.",
)
def main(action: str, resource: str) -> None:
    pass

if __name__ == "__main__":
    main(prog_name="myctl")

我不确定我应该使用哪些点击元素来构建它(参数、选项、组等)以及如何将它们组合在一起。

【问题讨论】:

    标签: python python-3.x command-line-interface python-click


    【解决方案1】:

    我过去通过创建多个嵌套组实现了这一点。

    import click
    
    
    @click.group('cli')
    def cli():
        pass
    
    
    @click.group('init')
    def init():
        pass
    
    
    @click.group('create')
    def create():
        pass
    
    
    @click.group('delete')
    def delete():
        pass
    
    
    @init.command('config')
    def config():
        print('Configuration complete')
    
    
    @create.command('issue')
    @click.argument('name')
    def issue(name):
        print(f'Created {name}')
    
    
    @create.command('pr')
    @click.argument('base_branch', required=False, default='master')
    def pr(base_branch):
        print(f'Created PR against {base_branch}')
    
    
    @create.command('branch')
    @click.argument('name')
    def branch(name):
        print(f'Create branch {name}')
    
    
    @delete.command('issue')
    @click.argument('issue_number')
    def delete_issue(issue_number):
        print(f'Deleting issue {issue_number}')
    
    
    @delete.command('pr')
    @click.argument('pr_number')
    def delete_pr(pr_number):
        print(f'Deleting PR {pr_number}')
    
    
    @delete.command('branch')
    @click.argument('branch_name')
    def delete_branch(branch_name):
        print(f'Deleting branch {branch_name}')
    
    
    @delete.command('config')
    @click.argument('config_name')
    def delete_config(config_name):
        print(f'Deleting config {config_name}')
    
    
    cli.add_command(init)
    cli.add_command(create)
    cli.add_command(delete)
    
    
    def run_cli():
        cli()
    
    
    if __name__ == "__main__":
        run_cli()
    

    然后您可以随意扩展它,调用如下所示。我已经调用了我的 CLI play

    ❯ play
    Usage: play [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --help  Show this message and exit.
    
    Commands:
      create
      delete
      init
    
    ❯ play init
    Usage: play init [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --help  Show this message and exit.
    
    Commands:
      config
    
    ❯ play init config
    Configuration complete
    
    ❯ play create
    Usage: play create [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --help  Show this message and exit.
    
    Commands:
      branch
      issue
      pr
    
    ❯ play create branch feature/the-coolest
    Create branch feature/the-coolest
    

    然后您可以继续添加简短的帮助消息并将其自定义到您的应用程序。

    【讨论】:

    • P.S.如果您正在寻找适用于 Git 的特定 CLI 实用工具,而不仅仅是一个学习练习,这里有一些非常好的可用工具,它们提供了一些非常有用的功能
    • 酷@afterburner,谢谢。顺便说一句,您推荐哪些 git CLI 实用程序?
    • 在很大程度上,我对集线器非常满意。我最终开发了自己的,因为我需要更多东西来应对工作(想想用一个命令克隆数百个 repos)。我知道 hub 不再支持官方 Git CLI 开发,这很酷,但它正在进行中 github.com/github/hub github.com/cli/cli
    • 我看了一下这些,我正在创建自己的也可以同时管理多个项目。我也使用 Github Enterprise 和 Gitlab。所以他们没有帮助我。
    • 集线器与 GHE 一起使用。我没有研究过 Gitlab,我不知道它的 API 是否与 Github 的不同。但是,如果您要克隆多个存储库,查看多个存储库中的 PR,提高 PR,检查多个存储库中的新分支以进行交叉存储库贡献,我可以在一两天内开源我的,并且这不是你开始的白板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多