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

如何配置shiv复用已有.venv site-packages避免重复下载依赖

解决Shiv在CI环境重复下载依赖的问题

问题场景

在CI环境中,已通过PDM(以Setuptools为构建后端)完成项目前置构建,所有依赖都存在于PDM创建的.venv虚拟环境中,但执行Shiv打包命令时,Shiv仍会重新下载所有依赖甚至构建部分包。

当前使用的Shiv命令:

pdm run shiv --compressed -e myproject.cli:cli -o myproject.pyz 
-p '/usr/bin/env python3.12' --no-build-isolation 
--site-packages .venv/lib/python3.12/site-packages

原因分析

Shiv默认会读取项目的pyproject.toml解析依赖声明,即使指定了--site-packages参数,它仍会尝试去满足这些依赖(下载、构建),而不是直接复用虚拟环境中已有的包。

解决方案

1. 添加--no-deps参数跳过依赖收集

修改Shiv命令,加入--no-deps参数,让Shiv跳过依赖解析与安装步骤,直接打包指定site-packages目录中的内容:

pdm run shiv --compressed -e myproject.cli:cli -o myproject.pyz \
-p '/usr/bin/env python3.12' --no-build-isolation \
--site-packages .venv/lib/python3.12/site-packages \
--no-deps

2. 确保项目已安装到虚拟环境

打包前需确保项目本身已安装到.venv中,执行以下命令完成安装:

pdm install

这样.venv/lib/python3.12/site-packages中会包含项目代码和所有依赖,打包后的.pyz文件才能正常运行。

3. 用环境变量替代硬编码路径(可选)

为避免CI环境中路径硬编码出错,可使用$VIRTUAL_ENV变量指定site-packages路径:

pdm run shiv --compressed -e myproject.cli:cli -o myproject.pyz \
-p '/usr/bin/env python3.12' --no-build-isolation \
--site-packages $VIRTUAL_ENV/lib/python3.12/site-packages \
--no-deps

内容的提问来源于stack exchange,提问作者Cristiano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:52:32