关于 Python 环境可复现性请教

36 天前
 xgq89757
公司 toB 项目 python 三方依赖有 150+,有没有比较优雅的方式能严格按照 requirements.txt (可能存在版本冲突)复现依赖环境,pip install -r requirements.txt 有个问题就是没准过段时间构建出来的环境就和 requirements.txt 中的不一致了

目前的做法是将环境做成了基础镜像,每次交付都基于这个镜像打包。不同版本有增量依赖或版本调整时在 Dockerfile 中单独 pip install ,但这也存在基础镜像管理和基础镜像复现的问题。
3522 次点击
所在节点    Python
57 条回复
1018ji
35 天前
把所有的库都捞下来,库还依赖库,只搞几个必然起飞
xgq89757
35 天前
@Hopetree 是的,我们的项目就是模型平台,会有数据分析和建模场景,不少库需要编译。客户环境也不统一,有 arm 的有 x86 的,还有的会有信创要求。
xgq89757
35 天前
@SunDoge 目前就有 conda 、pypi 混用的情况,有些库 pypi 装起来不是缺这个就是缺那个,然后就直接用 conda 装了。
xgq89757
35 天前
@SmiteChow 考虑跨平台还是不太合适,现在的一个交付镜像就得两个过 g 大小。
xgq89757
35 天前
@h404bi 打包和环境迁移到不是问题,主要是想寻求种环境从 0 复现的优雅方式。
fightff
35 天前
以前我们 python 项目的管理是集中维护 requirement txt, 所有人开发都用统一指定的固定版本。依赖需要升级或者切版本的话要 review 之后再修改。可以减少一定的环境问题。
fbichijing
35 天前
> pip install -r requirements.txt 有个问题就是没准过段时间构建出来的环境就和 requirements.txt 中的不一致了

??这个“没准”是个啥意思?莫须有?
noparking188
35 天前
你这个场景不可能吧,150+个依赖谁知道里面又衍生依赖了几百个,有没有二进制编译的依赖。镜像是对的,离线安装 docker ,各大 Linux 发行版挨个支持一下离线安装。
我之前给银行交付,就是写脚本离线安装 docker 起容器。
给未知的几百个 python 包依赖做各个系统兼容,不如把已知的 docker 各系统安装兼容做好。
不要交付 Dockerfile ,交付编译打包好的镜像 tar 包。
再优化下把 pip install -r requirements.txt 换成 uv 。
AkinoKaedeChan
34 天前
用 Nix Flake ,lock 不动 100% 复现
dododada
33 天前
48 楼的方法是最好的,docker 镜像包直接运行,设备只要能跑 docker ,就不要担心环境问题,另外镜像包交付还可以加密
xgq89757
33 天前
@fbichijing 那种 toml 中只指定了最小版本要求的未来迭代情况谁说的准呢,可以看下 19 楼的回复。
xgq89757
33 天前
@noparking188 这 150+已经是 pip freeze 导出的所有依赖,有部分需要二进制编译的依赖。交付过程跟你这差不多,都是离线包安装中间件,然后部署各应用服务。
enrolls
31 天前
开源方案没有,楼主愿意付费的话,我给你开发一个 pip 包管理的工具,顺带可以审计安装的包的安全性。
wenrouxiaozhu
31 天前
https://github.com/astral-sh/rye 试试

absl-py==2.1.0
# via tensorboard
# via tensorflow
amqp==5.2.0
# via kombu
appnope==0.1.4 ; sys_platform == 'darwin'
# via ipython
asgiref==3.8.1
# via django
# via django-cors-headers
tomkliyes
29 天前
pip-tools ,会把 requirements 里的包和他下面的依赖全部找出来,固定所有包的版本,重新生成 requirements.txt
hi9527
22 天前
pip install -r aaa.txt -c bbb.txt
aaa.txt 里面存的是你项目里面直接用到的依赖的包的信息
bbb.txt 里面存的是你的虚拟环境里面所有的包的信息

这样的话应该就不会出现由于依赖的依赖变化了导致环境变化了,遇到过这样的坑
sswfive
11 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1152582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX