如何在关联Python库外打包CLI?Flit适配方案咨询
实现库与CLI分离打包(Flit方案)
一、项目结构设计
采用嵌套式结构,将CLI模块作为库的子目录,既保留库的便捷导入,又实现CLI的延迟加载:
mylib/ ├── mylib/ │ ├── __init__.py # 库的主入口,可正常导出核心功能 │ ├── core/ # 依赖numpy/torch的核心代码 │ │ ├── __init__.py │ │ └── operations.py │ └── cli/ # 无慢依赖的CLI模块 │ ├── __init__.py │ └── main.py └── pyproject.toml
二、Flit配置(pyproject.toml)
在配置中指定CLI入口,同时声明库的依赖:
[project] name = "mylib" version = "0.1.0" dependencies = [ "numpy>=1.21", "torch>=1.10" ] [project.scripts] mycli = "mylib.cli.main:main"
三、CLI实现(延迟导入核心库)
以click为例,仅在具体命令的执行逻辑中导入慢依赖的核心库,避免--help或补全时加载:
# mylib/cli/main.py import click @click.group() def main(): """MyLib CLI工具""" pass @main.command() @click.argument("input_path") def process(input_path): """处理输入文件(仅此时加载核心依赖)""" # 延迟导入核心库 from mylib.core.operations import process_file process_file(input_path) @main.command() def status(): """查看状态(无依赖加载)""" click.echo("CLI已就绪,执行具体命令将加载核心库") if __name__ == "__main__": main()
四、Shell补全处理
如果使用click,补全逻辑默认不会触发命令函数的执行,因此无需额外处理——补全时只会解析命令结构,不会导入核心库。若自定义补全函数,确保补全函数内部不涉及慢依赖的导入即可。
五、验证效果
安装后执行以下命令测试:
mycli --help:瞬间响应,无numpy/torch导入耗时mycli status:快速输出状态,未加载核心依赖mycli process data.txt:此时才会导入numpy/torch并执行核心逻辑
这样既保留了import mylib的便捷导入方式,又实现了CLI的快速启动,完全基于Flit的pyproject.toml配置,无需编写setup.py。
内容的提问来源于stack exchange,提问作者Gabriel Belouze
相关产品推荐
相关产品推荐

