如何通过Poetry实现主库与带可选依赖的CLI脚本共存安装?
实现Python库与可选CLI工具的分离依赖配置
需求说明
我正在构建独立Python库mylib(包含module.py模块,支持直接import使用),同时开发了存放在scripts目录的CLI工具myscript.py(不属于mylib)。该CLI依赖mylib不需要的schema包,需要实现:
- 执行
poetry install时:不安装CLI相关依赖,且无法运行myscript - 执行
poetry install --with myscript时:安装CLI依赖,可通过poetry run myscript或直接myscript运行
已配置[tool.poetry.group.myscript.dependencies],需结合poetry.script实现,暂不拆分项目。
实现步骤
1. 完善pyproject.toml配置
补充脚本入口绑定,并确保主库与CLI依赖分离:
[tool.poetry] name = "mylib" version = "0.1.0" description = "独立Python库" authors = ["你的名字 <your@email.com>"] # 仅打包主库目录,排除scripts packages = [{ include = "mylib" }] # 主库核心依赖(无schema) [tool.poetry.dependencies] python = "^3.8" # CLI工具专属依赖组 [tool.poetry.group.myscript.dependencies] schema = "^0.7.5" # 绑定CLI脚本入口到scripts/myscript.py的main函数 [tool.poetry.scripts] myscript = "scripts.myscript:main"
2. 调整myscript.py的入口逻辑
在scripts/myscript.py中添加依赖检查,确保未安装CLI依赖时无法运行:
# scripts/myscript.py import sys # 检查CLI专属依赖 try: import schema except ImportError: print("错误:请先执行 `poetry install --with myscript` 安装CLI所需依赖", file=sys.stderr) sys.exit(1) # 导入主库模块 from mylib.module import some_function def main(): # 编写你的CLI业务逻辑 print("myscript 运行中,已加载schema依赖") some_function() if __name__ == "__main__": main()
3. 验证流程
基础安装(无CLI支持):
执行poetry install,此时schema不会被安装。尝试运行poetry run myscript会直接抛出依赖缺失提示,无法正常执行。安装CLI依赖后:
执行poetry install --with myscript,schema会被自动安装。此时:- 可通过
poetry run myscript直接运行CLI - 激活虚拟环境(
poetry shell)后,直接输入myscript即可启动工具
- 可通过
参考项目结构示例
不少Python开源库采用类似模式:主库提供核心API,将CLI工具放在独立目录(如scripts/cli),通过Poetry分组依赖实现按需安装,既避免主库依赖冗余,又能为需要CLI功能的用户提供便捷入口。
内容的提问来源于stack exchange,提问作者deppep
相关产品推荐
相关产品推荐

