如何将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
相关产品推荐
相关产品推荐

