使用setuptools:如何在pyproject.toml中声明可选脚本与模块?
Python项目可选模块与脚本的配置方案
要实现默认安装仅包含核心模块,且脚本仅在安装[extra]可选依赖时才安装的需求,按以下方式修改pyproject.toml:
1. 区分核心模块与可选模块
明确默认安装的核心模块为src/myproject/modules/下的内容,src/myproject/extra/作为可选模块单独声明:
方式一:手动声明包(推荐,更清晰)
[tool.setuptools.packages] # 核心包,默认安装 myproject = {path = "src/myproject"} myproject.modules = {path = "src/myproject/modules"} # 可选包,仅在安装extra依赖时才会被包含 myproject.extra = {path = "src/myproject/extra", optional = true}
方式二:基于find规则过滤
如果习惯用packages.find批量识别包,可通过排除可选模块+单独声明的方式实现:
[tool.setuptools.packages.find] where = ["src"] include = ["myproject*"] exclude = ["myproject.extra*"] [tool.setuptools.optional-packages] myproject.extra = {path = "src/myproject/extra"}
2. 将可选模块绑定到extra依赖组
把可选模块和extra可选依赖组关联,确保安装pip install myproject[extra]时自动包含这些模块:
[project.extras] extra = ["myproject.extra"] [project.optional-dependencies] extra = [ "tqdm", "antspyx>=0.4.2", "scikit-image", "mpi4py", "scipy" ]
3. 配置可选脚本
让reg和conv脚本仅在安装extra时才被安装到系统路径中,修改脚本声明为带extras参数的形式:
[tool.setuptools.scripts] reg = {script = "myproject._cmd.reg:main", extras = ["extra"]} conv = {script = "myproject._cmd.conv:main", extras = ["extra"]}
完整配置示例
整合后的pyproject.toml参考如下:
[project] name = "myproject" version = "0.1.0" dependencies = [] # 填写你的核心依赖 [project.optional-dependencies] extra = [ "tqdm", "antspyx>=0.4.2", "scikit-image", "mpi4py", "scipy" ] [project.extras] extra = ["myproject.extra"] [tool.setuptools.packages] myproject = {path = "src/myproject"} myproject.modules = {path = "src/myproject/modules"} myproject.extra = {path = "src/myproject/extra", optional = true} [tool.setuptools.scripts] reg = {script = "myproject._cmd.reg:main", extras = ["extra"]} conv = {script = "myproject._cmd.conv:main", extras = ["extra"]}
验证效果
- 执行
pip install myproject:安装后,myproject.extra模块不存在,reg和conv命令无法调用。 - 执行
pip install myproject[extra]:安装后,myproject.extra模块可用,reg和conv命令正常生效。
内容的提问来源于stack exchange,提问作者MSco
相关产品推荐
相关产品推荐

