如何在setup.cfg中引用同级/上级目录的Python包作为项目依赖
之前使用..路径不生效有两个核心原因:
- pip默认开启构建隔离,会在随机临时目录中执行包构建流程,临时目录的上层不存在对应的ProjectA路径
- 仅配置单个包的
package_dir未配合包扫描规则,setuptools不会主动去上层目录扫描所有可用包
以下是两种无需软链接、无需修改目录结构的可行方案:
方案1:将ProjectA作为依赖声明(推荐)
因为ProjectA本身自带setup.{cfg,py}是合法的Python包,你可以直接在ProjectB的setup.cfg中将其声明为本地路径依赖:
[options] install_requires = ProjectA @ file://../ProjectA
执行pip install .时,pip会自动解析相对路径找到ProjectA目录,将其安装到当前虚拟环境的site-packages中,ProjectA下所有的包都会自动可用,不需要为每个包单独配置。
这种方式完全符合Python打包规范,不需要修改任何默认配置。
方案2:直接打包ProjectA的包到ProjectB中
如果你不想将ProjectA作为独立依赖安装,希望直接把ProjectA的代码和ProjectB一起打包进安装产物,可以按如下配置:
- 先在ProjectB目录下新建
pyproject.toml声明构建后端(如果还没有的话):
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta"
- 修改
setup.cfg配置,指定setuptools同时从上层ProjectA和当前目录扫描包:
[options] packages = find: [options.packages.find] where = ../ProjectA .
- 安装时需要关闭pip的构建隔离,否则构建环境的临时目录无法访问上层的ProjectA路径:
pip install . --no-build-isolation
这种方式会把ProjectA下所有的包和ProjectB的包一起打包,安装后都会出现在site-packages目录中,注意如果两个项目下有同名包会出现冲突。
内容的提问来源于stack exchange,提问作者Ptival
相关产品推荐
相关产品推荐

