You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Click开发的CLI命令拆分到多个Python文件实现分级子命令调用

Click多文件拆分命令实现方案

失效原因

你之前的方案无法识别amogus.py中命令的核心原因是:amogus.py内的命令注册逻辑从未被执行,程序入口加载时仅读取了根组所在文件,不会自动加载其他模块的注册代码,因此子命令没有实际挂载到group上。

具体实现步骤

1. 定义顶层根组(main.py)

根组作为testcli1命令的总入口,统一挂载所有子模块的命令组:

import click
from scripts.maintest import maintest_group
from scripts.amogus import amongus_group

@click.group()
def cli():
    pass

# 挂载子命令组
cli.add_command(maintest_group, name="maintest")
cli.add_command(amongus_group, name="amongus")

if __name__ == "__main__":
    cli()

2. 编写子模块命令组

scripts/maintest.py

import click

@click.group()
def maintest_group():
    """maintest 相关功能命令"""
    pass

# 示例子命令,可替换为实际业务逻辑
@maintest_group.command()
def demo1():
    click.echo("执行maintest下的demo1命令")

scripts/amogus.py

import click

@click.group()
def amongus_group():
    """amongus 相关功能命令"""
    pass

# 示例子命令,可替换为实际业务逻辑
@amongus_group.command()
def demo2():
    click.echo("执行amongus下的demo2命令")

3. 配置setup.py入口点

在setup.py中指定console_scripts指向根组,绑定testcli1命令:

from setuptools import setup, find_packages

setup(
    name="Grouptest",
    version="0.1",
    packages=find_packages(),
    entry_points={
        "console_scripts": [
            "testcli1 = main:cli",
        ]
    },
    install_requires=["click>=8.0"],
)

功能验证

重新执行pip install -e .安装后,即可按预期调用命令:

  • testcli1 maintest demo1 调用maintest模块下的命令
  • testcli1 amongus demo2 调用amongus模块下的命令

进阶优化(可选)

如果后续子模块数量持续增加,不想每次新增模块都手动修改main.py导入,可以在scripts/__init__.py中编写自动扫描逻辑,自动识别所有子模块的命令组并挂载到根组,省去手动导入步骤。

内容的提问来源于stack exchange,提问作者lemuria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:54:02