如何将含PyPi依赖的Python项目打包为.deb?stdeb+venv可行吗?
用stdeb结合venv封装PyPi依赖构建.deb包的可行方案
核心思路
stdeb本身倾向于依赖系统Debian仓库的Python包,对PyPi独有的包支持较差。结合venv的核心是先把项目所有PyPi依赖转换成本地Deb包,再让主项目构建时依赖这些本地包;或是直接将venv中的依赖文件打包进最终deb,绕开系统仓库的限制。
方法一:先转依赖为Deb包,再构建主项目
- 创建并激活干净的venv
# 创建独立venv环境 python3 -m venv ./project_venv # 激活venv source ./project_venv/bin/activate # 更新基础打包工具 pip install --upgrade pip setuptools wheel stdeb # 安装项目所有依赖(替换为你的requirements文件或直接指定包名) pip install -r requirements.txt
- 批量将venv依赖转成Deb包
遍历venv内已安装的包,用stdeb逐个生成Deb包并存放至本地目录:
# 创建存放依赖Deb的目录 mkdir -p ./local_debs # 导出所有依赖包名(排除本地可编辑安装的项目) pip freeze | grep -v "^-e" | cut -d'=' -f1 | while read pkg; do # 用stdeb将PyPi包转成Deb,输出到local_debs目录 pypi-install -d ./local_debs $pkg done
- 添加本地仓库并构建主项目
让系统apt识别本地仓库,确保stdeb构建时优先使用本地的依赖Deb包:
# 将本地仓库添加到apt源 echo "deb [trusted=yes] file://$(pwd)/local_debs ./" | sudo tee /etc/apt/sources.list.d/local_pypi_deps.list sudo apt update # 回到项目根目录,用stdeb构建主项目的Deb包 python setup.py --command-packages=stdeb.command bdist_deb
方法二:直接将venv依赖打包进主Deb包(粗暴高效)
若不想逐个转换依赖包,可直接把venv中site-packages的内容打包进最终Deb,适合快速封装独立项目:
- 修改setup.py
在setup()函数中添加data_files配置,指定将venv的依赖文件安装到系统Python目录:
import os from setuptools import setup # 替换为你的venv中site-packages路径(注意Python版本号) venv_site_packages = os.path.join(os.getcwd(), "project_venv", "lib", "python3.10", "site-packages") setup( # 你的项目原有配置 name="your_project", version="1.0.0", # ...其他配置... data_files=[ # 将venv依赖复制到系统的dist-packages目录 ("/usr/lib/python3/dist-packages", [os.path.join(venv_site_packages, f) for f in os.listdir(venv_site_packages)]) ] )
- 构建Deb包
激活venv后直接执行stdeb构建命令:
source project_venv/bin/activate python setup.py --command-packages=stdeb.command bdist_deb
注意:这种方式可能和系统已安装的Python包冲突,适合无依赖冲突的独立项目。
关键注意事项
- 确保venv是干净的:只安装项目必需的依赖,避免打包多余文件增大Deb体积。
- 方法一生成的依赖Deb可重复使用,适合多次构建同一项目或多个项目共享依赖。
- 若遇到某个PyPi包无法转成Deb的情况,可手动下载该包源码,补充
setup.py后再用stdeb打包。
内容的提问来源于stack exchange,提问作者Guilherme Lourenço da Silva
相关产品推荐
相关产品推荐

