![]() | 1 dzdh 55 天前 用 uv 。lock 版本。 |
![]() | 2 JoeJoeJoe PRO 可以给项目加个虚拟环境, python 应该有很多这样的库, pyenv, venv 之类的. 参考链接: 1. https://www.cnblogs.com/doublexi/p/15783355.html 2. https://www.cnblogs.com/doublexi/p/15786911.html |
![]() | 3 wombat 55 天前 venv + requirement ,还有约定指定的 python 版本。 当然,即使这样,python 构建出的成果也有可能有问题。 我曾经在不同的电脑完全一模一样 venv ,依赖版本一样的环境,用 pyinstaller 打包的结果,不一样。 |
![]() | 5 iorilu 55 天前 复杂的项目直接打包部署镜像是最好的 |
![]() | 8 xgq89757 OP @dzdh 用 ai 对比了 uv 和 pixi ,ai 指出 uv 对需要二进制编译的包支持不太友好,项目中算法和机器学习库不少,最近在尝试 pixi ,仍遇到安装环境出现版本冲突的问题,可能 toml 没有编排好的问题。后边准备尝试下 uv ,验证下 ai 的结论。 |
![]() | 10 xgq89757 OP @blackshadow 还有就是项目是在某些版本冲突下稳定运行的,-r 构建就会报错退出,只能先注释掉冲突的包,最后在单独 install |
![]() | 11 JoeJoeJoe PRO |
![]() | 13 killva4624 55 天前 @xgq89757 #9 pip install -r 为啥不会一样,没指定版本号吗? |
![]() | 14 maocat 55 天前 via Android 合理怀疑 requirements.txt 里面没有吧对应的的包的关联依赖包拉进来, 试一试 pip freeze 全量输出 |
![]() | 15 xgq89757 OP @killva4624 全指定了版本号的,清单是从当前稳定运行的环境中 pip list --format=freeze 拉下来的, 后续就是想通过这个清单复现环境,但是有些包会出现版本冲突或者构建下来的环境和清单不一致。 |
![]() | 16 xgq89757 OP @iorilu 目前就是这样的,运行环境打包成基础镜像,交付打包时再将混淆的工程打包进镜像。但是遇到不允许容器化部署的客户就比较麻烦了,要根据客户的环境做离线包,客户是金融、银行之类的基本都没有公网。 |
![]() | 17 wombat 55 天前 @xgq89757 感觉最好的办法就是你上面的了,一是容器化部署;二是全部的依赖包都本地保存离线版,环境里全部离线安装。 感觉你这个要求和我们之前很像,我们之前给客户装环境完全内网,rpm 服务都是自己搭建,找个大硬盘里面装了所有需要的离线包。 |
18 Mithril 55 天前 ![]() 虽说也推荐你用 uv ,但你这个环境和要求,光靠 uv 是没法彻底解决的。你要考虑的是依赖的可信与供应链管理,而不简单的一个 lock 。 正常做法是,内网搭建 pip 的镜像服务,并且配置多个 pip 仓库。至少三个,dev ,integration ,release 。只有 dev 是联通外网的 mirror ,其他两个是本地库。 然后你开发的时候 pip 指向 dev库,发版的时候,QA 和测试用 integration 库。这时候把你需要的指定版本的所有依赖从 dev 提升复制到 integration 库内。 当 QA 和测试完成,再次把这些依赖到 release 库内。作为最终 release 的二进制依赖,同时对依赖进行漏洞检查和制做 SBOM 。 当然你可以根据你们的要求自己调整一下,可能也用不到这么严格的流程。但本质上为了避免 FOSS 的供应链风险,你应该自己保留所有依赖的二进制及其代码以供审查,并且可以完全从本地构建你的产品。 别忘了之前 npm 下毒的事。 |
![]() | 19 xgq89757 OP @JoeJoeJoe 默认行为:pip 会安装满足条件的最新版本,比如某个三方依赖的子依赖要求是> 1.0 ,这个子依赖当时的最新版本是 1.5 ,当时安装的会是 1.5 ,过一段时间这个子依赖的版本迭代到到了 1.7 ,在这时它会安装 1.7 ,这个好解决,在 requirements.txt 中强制子依赖==1.5 ,但因为项目迭代比较久了,后续有人增加或修改了某些依赖,这个操作是直接在环境中单独安装的(这时候不会暴露冲突问题),然后归档依赖版本到 requirements.txt ,但是项目就是在这样的冲突下稳定运行的,时间久了你想在其他服务器复现环境再通过 requirements.txt 构建的时候就会发现有的包有版本冲突,这时候冲突的依赖只能单独安装,然后刷一遍版本。 |
![]() | 20 momocraft 55 天前 pip freeze 却不能重现有点怪 涉及到全局安装的包,或者嵌套的 venv 吗? |
![]() | 21 zhoudaiyu PRO 直接 docker 不就完事了 |
22 jasonchen168 55 天前 我也遇到了,头大。而且 Mac 和 Windows 还有些库不一样 |
![]() | 23 clemente 55 天前 pip install -r requirements.txt --target /home/local_env 下载好 然后上报保存 下次指定 pythonpath 到这个目录就好 |
![]() | 25 irory 55 天前 pip 安装可以离线包的,所有依赖都下载本地目录。 |
![]() | 26 tomczhen 55 天前 不涉及编译安装的话还是好解决的,如果想规避这个问题,以我目前的看法是只能选择提供编译好的二进制仓库源才行,这样就只剩下 conda 可以选了。考虑到商用的话,这个问题确实没那么容易。 |
28 moudy 55 天前 via iPhone @blackshadow 如果出现要打安全性补丁就完蛋了 |
![]() | 29 sazima 55 天前 使用 pip download 把包下载下来 |
![]() | 30 xgq89757 OP 还有种方式就是用脚本去逐个安装 requirements.txt 中的库了,绕过-r 的冲突检查。冲突的库单独装只会有 warnning ,但不会终止安装,最后再扫一遍版本。 |
![]() | 31 BingoW 55 天前 我记得 pip 是有一个原生的方法的,直接将你本地环境所有依赖达成一个大的 zip 包,然后在目标服务器直接安装就好了,目标服务器不需要联网,所有版本都跟本地服务器一致。 |
![]() | 32 xgq89757 OP @BingoW 之前公司内网的开发、测试、试用环境就是类似方法,直接压缩 miniforge 的 env 下对应工程的虚拟环境进行迁移。后来让我全部改成容器化部署了,省去了很多工作量。测试基于镜像测试,交付时直接交付镜像文件。 |
35 SunDoge 55 天前 @xgq89757 #8 大部分算法库都提供了预编译二进制包,用 uv 很少会出现不友好的地方。pypi 的 python 库比 conda 、conda-forge 还是多的,用 pixi 会遇到部分依赖在 pypi ,部分依赖在 conda 的问题,解决依赖冲突会比较麻烦。 |
36 misoomang 55 天前 即使 requirment.txt 的包指定了版本,每个包对应支持的 Python 版本的范围会不一样,如果传统部署的 Python 版本不固定,即使指定了 pip 包的版本,在不同的 Python 版本下安装也会出现差异 |
![]() | 37 Hopetree 55 天前 如果是容器肯定是搞成基础镜像是最优解啊,特别是机器学习应该会设计到一些需要编译使用的第三方库,这种库的安装不仅仅是 pip 能解决的,还跟服务器环境有关,很难保证依赖顺利安装,所以基础镜像就可以忽略这些问题 |
![]() | 38 h404bi 55 天前 |
![]() | 39 SmiteChow 55 天前 十年前的工程实践是把所有包下载下来放到 git 里面去,现在依然是这样,没办法。 |
40 lovepocky 55 天前 poetry |
41 1018ji 55 天前 把所有的库都捞下来,库还依赖库,只搞几个必然起飞 |
![]() | 42 xgq89757 OP @Hopetree 是的,我们的项目就是模型平台,会有数据分析和建模场景,不少库需要编译。客户环境也不统一,有 arm 的有 x86 的,还有的会有信创要求。 |
46 fightff 55 天前 以前我们 python 项目的管理是集中维护 requirement txt, 所有人开发都用统一指定的固定版本。依赖需要升级或者切版本的话要 review 之后再修改。可以减少一定的环境问题。 |
47 fbichijing 54 天前 > pip install -r requirements.txt 有个问题就是没准过段时间构建出来的环境就和 requirements.txt 中的不一致了 ??这个“没准”是个啥意思?莫须有? |
![]() | 48 noparking188 54 天前 你这个场景不可能吧,150+个依赖谁知道里面又衍生依赖了几百个,有没有二进制编译的依赖。镜像是对的,离线安装 docker ,各大 Linux 发行版挨个支持一下离线安装。 我之前给银行交付,就是写脚本离线安装 docker 起容器。 给未知的几百个 python 包依赖做各个系统兼容,不如把已知的 docker 各系统安装兼容做好。 不要交付 Dockerfile ,交付编译打包好的镜像 tar 包。 再优化下把 pip install -r requirements.txt 换成 uv 。 |
![]() | 49 AkinoKaedeChan 54 天前 via iPhone 用 Nix Flake ,lock 不动 100% 复现 |
![]() | 50 dododada 52 天前 48 楼的方法是最好的,docker 镜像包直接运行,设备只要能跑 docker ,就不要担心环境问题,另外镜像包交付还可以加密 |
![]() | 51 xgq89757 OP @fbichijing 那种 toml 中只指定了最小版本要求的未来迭代情况谁说的准呢,可以看下 19 楼的回复。 |
![]() | 52 xgq89757 OP @noparking188 这 150+已经是 pip freeze 导出的所有依赖,有部分需要二进制编译的依赖。交付过程跟你这差不多,都是离线包安装中间件,然后部署各应用服务。 |
![]() | 53 enrolls 51 天前 开源方案没有,楼主愿意付费的话,我给你开发一个 pip 包管理的工具,顺带可以审计安装的包的安全性。 |
54 wenrouxiaozhu 51 天前 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 |
![]() | 55 tomkliyes 49 天前 pip-tools ,会把 requirements 里的包和他下面的依赖全部找出来,固定所有包的版本,重新生成 requirements.txt |
56 hi9527 42 天前 pip install -r aaa.txt -c bbb.txt aaa.txt 里面存的是你项目里面直接用到的依赖的包的信息 bbb.txt 里面存的是你的虚拟环境里面所有的包的信息 这样的话应该就不会出现由于依赖的依赖变化了导致环境变化了,遇到过这样的坑 |
57 sswfive 30 天前 |