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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:17