如何让pip可编辑安装时跳过已以可编辑模式安装的依赖
如何让pip尊重已安装的可编辑模式Python包,避免重复安装?
我日常维护多个通过pyproject.toml管理依赖的Python包,希望全部以可编辑模式(-e)安装,但遇到了依赖冲突的问题:比如有parent和child两个包,child的pyproject.toml里依赖parent。如果先装parent(pip install -e .),再装child时,pip会尝试从仓库下载并重新安装parent,把本地的可编辑版本覆盖掉,非常容易搞混环境。
我试过两种方案,但都有缺陷:
- 用
pip install -e . --no-deps装child:虽然能保留parent的可编辑版本,但会跳过child的其他第三方依赖,不够实用。 - 逆序安装(先装
child再装parent):简单场景可行,但依赖树复杂、子包多的时候根本没法操作。
现在想找一种通过pyproject.toml配置或者pip参数实现的方案,让pip自动尊重已有的可编辑版本包,不用手动处理顺序或跳过所有依赖。
可行方案
1. 使用pip的--no-upgrade参数(推荐)
安装child时添加--no-upgrade参数:
pip install -e . --no-upgrade
这个参数会让pip仅安装缺失的依赖,不会对已安装的包(包括可编辑模式的parent)进行升级或重新安装。只要已安装的parent版本满足child的依赖要求,pip就会直接使用本地的可编辑版本,不会去仓库下载替换。
2. 在pyproject.toml中指定本地依赖路径
如果希望从配置层面固定依赖来源,可以在child的pyproject.toml中给parent添加本地路径限定:
[project] dependencies = [ # 绝对路径示例 "parent @ file:///home/you/projects/parent", # 相对路径示例(如果两个包在同一父目录下) # "parent @ file://../parent", # 其他第三方依赖 "requests>=2.25.1", ]
这样pip安装child时会直接指向本地的parent目录,不会尝试从远程仓库获取。缺点是路径是硬编码的,换环境或目录结构变化时需要修改配置。
3. 拆分安装:跳过特定依赖+手动补全其他依赖
如果只想跳过parent的重新安装,但保留其他依赖的自动安装,可以分两步操作:
- 安装
child的可编辑模式并跳过所有依赖:
pip install -e . --no-deps
- 提取
child的依赖列表,排除parent后安装其他第三方依赖:
比如先通过pip show child查看依赖,然后手动安装:
pip install requests>=2.25.1 # 替换为child的其他第三方依赖
或者用命令行工具自动提取(Linux/macOS环境):
pip install $(pip show -f child | grep -A10 Requires | tail -n+2 | grep -v parent)
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

