也是醉了,最近使用 docker+poetry 1.5.1 部署一个项目,dockerfile 模板之前一直正常,最近推送代码到部署环境,发现 docker build 居然失败。一查发现怎么缺少了依赖库?平时使用 poetry 安装不都是自动装依赖库的吗?
去 github issue 一查,发现这个问题才明白,poetry 的依赖崩了。。。导致重新创建新的环境的时候,再使用 poetry 创建环境就出现安装依赖错误。。。
解决方案是要锁定 pkginfo 版本
poetry self add pkginfo==1.10.0
但是改了好几次 dockerfile 还是不行,最后还是导出 requirements.txt ,用 pip 方式安装,改写 dockerfile 后终于部署正常了。。。
以前受过 pipenv 的教训,它过了一段时间再安装,会出可能启动不了项目,是由于 pipenv 没有完全锁死依赖库版本。现在本来以为 poetry 包管理器足够稳定,可以一直安心用不加班,没想到现在又要重新更好一点的包管理器,或者用回 pip
1 runinhard 2024-09-24 13:14:44 +08:00 ![]() 是的 ,全他么是垃圾 |
2 dcoder 2024-09-24 13:30:00 +08:00 go.mod / Rust cargo: 我不是针对你 poetry, 我是说在座的各位 python 包管理, 都是垃圾 ... |
3 dcoder 2024-09-24 13:32:12 +08:00 认真讨论, Python 的包管理真的太拉胯了... 说实话, 最近在考虑, 干脆用 conda + lock 得了 https://github.com/conda/conda-lock 还方便折腾 AI 的东西 |
5 dcoder 2024-09-24 13:37:35 +08:00 @Mithril npm 和 Python 的包管理感觉烂得各有千秋 最近不太用 JS/Node, npm 那个堪比黑洞质量的文件重复问题,貌似优化了不少了? |
![]() | 6 jiayouzl 2024-09-24 13:39:35 +08:00 ![]() pip 适合 99.99%开发者!别搞什么花里胡哨的!我以前就用 virtualenv 后来 Python 自带虚拟环境了我连 virtualenv 都不装了. |
![]() | 7 itskingname 2024-09-24 13:40:36 +08:00 Python 3.12 开始,pip 安装就会给你报错缺少 Imp 包。 |
![]() | 8 cherryas 2024-09-24 13:40:52 +08:00 原生 env 一把梭 |
![]() | 9 TimePPT PRO 开发环境 poetry ,部署乖乖用 pip... |
![]() | 10 SilentOrFight 2024-09-24 13:57:33 +08:00 python 包管理是真的乱 |
![]() | 11 SenLief 2024-09-24 13:57:49 +08:00 我都是用自带的 venv ,可能项目比较小。 |
![]() | 12 Goooooos 2024-09-24 14:00:11 +08:00 ![]() 懒得折腾,都是 conda+pip |
![]() | 14 Numbcoder 2024-09-24 14:07:41 +08:00 ![]() 每次看到有人尬吹 “人生苦短,我用 Python” 我就想笑 |
15 sweat89 2024-09-24 14:17:46 +08:00 我用 conda ,感觉很方便啊 |
![]() | 16 dishonest 2024-09-24 14:21:28 +08:00 确实是垃圾。不要说包管理不重要,太影响体验了。 我甚至因为 cargo 的便利,硬学了 rust 。 |
![]() | 17 encro 2024-09-24 15:20:19 +08:00 uv 真快。。。 |
![]() | 18 encro 2024-09-24 15:20:39 +08:00 pdm 也不错 |
![]() | 19 FleetingSound 2024-09-24 15:46:09 +08:00 poetry 挺好用的,uv 也不错. |
![]() | 20 qsnow6 2024-09-24 15:50:05 +08:00 依赖越少越好 |
![]() | 21 yolee599 2024-09-24 15:53:03 +08:00 ![]() python -m venv you_path 不就行了? |
![]() | 22 darksword21 PRO 能过部署能 pip 最好直接 pip conda 也是废物,经常无法 activate ,我在 sagemaker 上部署如果是 conda 的还导致没有日志 哎 python ,心累 |
23 houzhiqiang 2024-09-24 16:04:15 +08:00 目前在用 pdm ,没有遇到什么问题。pdm 运行慢我是无所谓 |
24 alexsz 2024-09-24 16:08:41 +08:00 用 docker 部署时我都不用 venv |
![]() | 25 phithon 2024-09-24 16:15:01 +08:00 PEP 668 以后,不用 virtualenv 以后默认不让 pip 装依赖了 |
![]() | 26 最近两年都在用 rye ,切到 uv 之后体验丝滑 |
![]() | 28 R4rvZ6agNVWr56V0 2024-09-24 16:25:32 +08:00 ![]() @Numbcoder 说这话的时候,还没有 go 、rust 什么事儿呢。抛开历史看问题你是会的。 |
![]() | 29 coolair 2024-09-24 16:25:55 +08:00 用 uv ,一步到位。 |
![]() | 30 pckillers 2024-09-24 16:27:09 +08:00 ![]() 都用 docker 了,自然直接 pip 全局安装啦。做好 image 版本备份,连 venv 都用不到。 |
![]() | 31 R4rvZ6agNVWr56V0 2024-09-24 16:37:12 +08:00 从 09 年开始就用 pip ,用了十多年了,没啥问题啊。 哈哈哈哈。操作姿势很重要。当然 Windows 平台除外。 |
32 siteshen 2024-09-24 18:00:52 +08:00 以前用 pipenv 的,不过 pipenv 的依赖自动更新很讨厌。现在用 pipenv (不要 pip) + pip 。 生产环境用 pip install -r requirments.txt 开发环境用 pipenv shell; # update pypi mirror; pip install -r requirments.txt |
33 youngce 2024-09-24 18:04:52 +08:00 venv + requirments.txt 。。。 |
![]() | 34 noqwerty 2024-09-24 18:41:17 +08:00 via iPhone micromamba/uv 目前为止没遇到解决不了的 |
35 NoOneNoBody 2024-09-24 18:54:12 +08:00 ![]() 一个包 A 存在依赖 B ,用这个 A 去管理其他的,这本来就是个危险的事,除非能保证 AB 同步 包 A 没有依赖,或者说仅依赖原生,才是相对安全的选择 框架也是类似逻辑,生活中很多事也是这个逻辑,依赖的东西应该仅限于方便行动,而不是方便掌控 |
![]() | 37 ClericPy 2024-09-24 21:59:53 +08:00 除了现在的 uv ,其他的全用了一遍,有的在生产环境遇到 bug (虽然提了以后作者修了),最后还是 venv 就够了。。。 至于发包,打包成 zipapp 也不耽误,执行环境还是 venv 省事 |
![]() | 38 Vegetable 2024-09-24 22:04:43 +08:00 哪有在容器里边再构建虚拟环境得道理? poetry export 为 requirements.txt ,然后容器里直接 pip 才对。 poetry 最大的问题是慢,不过我也早就跑路到 rye 了 |
![]() | 39 so1n 2024-09-24 22:28:54 +08:00 poetry,pdm 都是本地用啊,线上还是导出 requirements 把 |
![]() | 40 JZ8ZW193q6W9Awgy 2024-09-24 22:32:45 +08:00 @jiayouzl #6 我新手,觉得 pip+自带的 venv 也蛮好用的。。。 |
![]() | 42 Trim21 2024-09-25 01:09:42 +08:00 ![]() 因为 pip 没法有外部依赖,所以直接把他用到的依赖给 vendor 了,所以等你好久不升级 pip ,pip 告诉你版本太旧装不了新依赖的时候你只需要升级 pip 就行。 poetry 没 vendor ,所以你还需要升级 poetry 的依赖。 |
43 donglintong 2024-09-25 02:08:37 +08:00 uv +1 |
![]() | 44 jqtmviyu 2024-09-25 02:59:41 +08:00 uv +1 ```sh # 安装 uv pip install -r requirements.txt # 导出 uv pip freeze > requirements.txt ``` |
45 mayli 2024-09-25 03:55:34 +08:00 ![]() rye 好,快去用。 自从用了 rye ,我整个人的毒性都降低了,就感觉快 |
46 lgh 2024-09-25 07:32:48 +08:00 via iPhone 在用 pdm ,暂时没有想换的理由。 楼上好多人把环境隔离和依赖管理混为一谈的。 用 pip 最大的问题还是直接依赖和间接依赖的区别。如果不用 pdm 的时候我会用 requirements.txt 管理直接依赖、再 freeze 成 requirements-lock.txt ,否则要升级某个库的时候简直想死。 |
![]() | 47 hanxiV2EX 2024-09-25 07:48:04 +08:00 via Android pdm 真爽,用了回不去了。 |
![]() | 48 qwq11 2024-09-25 08:41:01 +08:00 via iPad uv+1 |
50 tairan2006 2024-09-25 08:51:05 +08:00 conda+pip 跑 docker 的话直接装全局就行 |
![]() | 51 kaktos 2024-09-25 08:57:13 +08:00 无脑上 uv ,其他看都不要看 |
52 bianjp PRO poetry 不支持全局配置使用国内的 PyPI 镜像站挺不方便的,官方一直不愿意做这个功能。 |
53 wryyyyyyyyyyyy 2024-09-25 09:21:55 +08:00 @encro pdm 综合使用体验感觉还不如 poetry ,吹的 pep 提出的那个特性被否了,没通过。 |
54 pl01665077 OP @dcoder 做 web 项目不太习惯用 conda ,嘿嘿 |
55 pl01665077 OP @jiayouzl 那也是,不过有时安装新的包总是忘记 pip freeze 等等。。。 |
56 pl01665077 OP @dishonest rust 我也会,不过 cargo 的源要配置国内源会方便点,一开始配置还挺麻烦的。。。 |
57 uni 2024-09-25 09:52:57 +08:00 uvuvuv |
58 pl01665077 OP @GeekGao 谢谢分享经历,哈哈,pip 还是稳 |
59 pl01665077 OP @siteshen 对,pipenv 自动更新依赖很讨厌。 |
60 pl01665077 OP @NoOneNoBody 对的,非常赞同! |
61 pl01665077 OP @Vegetable poetry 也可以不用虚拟环境安装的,直接在容器里面全局安装。dockerfile 使用 poetry 主要是保持开发和生产环境一致性,而且开发时只需要 poetry install ,部署时省去很多导出 requirements.txt 步骤 |
62 pl01665077 OP @lgh 是手写 requirements.tx 管理依赖,freeze 生成 requirements-lock.txt 依赖吗?学习了 |
![]() | 63 edisonwong 2024-09-25 10:03:30 +08:00 最舒心的是 go mod ,不过也有遇到管理 etcd 包一坨 shit 的时候(那是因为作者反 go mod 一直不修); npm 是一坨,yarn ,pnpm ( workspace )反正前端每次构建都是个玄学; python 也好不到哪里去哈哈哈 |
![]() | 64 lambdaq 2024-09-25 10:08:33 +08:00 ![]() 觉得 pip 垃圾的,因为很多东西是 .so 的东西导致的。 其他语言包管理不是强,而是原生性能能支持 99%的功能纯语言实现了 但凡你 cgo JNI 搞进去,依赖管理也会变得复杂。 纯.py 的包管理复杂吗?一点都不复杂。直接全部复制到项目 lib 目录就 vendoring 了。什么版本管理冲突安装失败,不存在的。举个例子,以前 requests 就是这样复制了一套 urllib3 打包一起的。 |
![]() | 65 Trim21 2024-09-25 10:18:23 +08:00 poetry 有 export ,你 poetry export -f requirements.txt --output requirements.txt 然后用 pip 装不就是了,还能减少 镜像层数。。。 |
66 chopin1998519 2024-09-25 10:22:11 +08:00 我用了十年 python , 一直都是 sudo pip 的。。。。 知道最近项目实在太杂,互相依赖玩儿崩了, 老老实实用了曾经嗤之以鼻的 venv+pip , 但是每个环境都重新来一次 nv 的那一大坨库实在不舒服。。。。 比较了一下 pdm/ uv , 目前选了 uv , 简单用了一下还是挺舒服的。。。 不过也遇到一个环境, 没法用, 单独给它开个 venv 。。。 |
![]() | 67 wupher 2024-09-25 10:51:46 +08:00 uv + 1 Rust 完善工具链方面,真是没说的。 |
68 pl01665077 OP @chopin1998519 对,每换个环境都重新来一次 pip+venv 太繁琐了,所以喜欢用 poetry install 一下就创建好了。 全局 pip 还是不太好,每个项目版本依赖不一样。 |
![]() | 69 sickoo 2024-09-25 11:06:21 +08:00 uv ? 我去看看 真的那么好用吗? |
![]() | 70 jiayouzl 2024-09-25 11:11:43 +08:00 @pl01665077 养成个习惯,在 git push 的时候就维护下 requirements.txt 就行了. |
71 stobacco 2024-09-25 11:32:41 +08:00 我也是和楼主一样的历程,被 python 包管理弄得心态炸过几次,导致我现在都害怕包管理这个玩意儿 比如 node 、go 的,我没学它们之前以为和 python 包管理一样乱。。。 |
72 dcoder 2024-09-25 11:35:41 +08:00 从这帖子里听说了 rye, uv 看了下, 都是 Rust 写的, 2023 才出来的新项目, git star: rye (13.6k), uv (20.9k) 好嘛, python 包管理真热闹, 没完没了了,是不是 XD 用来代替 conda 的话,哪个更好? |
![]() | 73 yb2313 2024-09-25 11:37:33 +08:00 有的项目用 poetry 安装一装一个报错, 还是用 uv 吧, rye 也是用的 uv |
![]() | 75 foyoux 2024-09-25 12:41:56 +08:00 pip + venv pip freeze > requirements.txt |
76 dcoder 2024-09-25 13:05:35 +08:00 看了下 rye ,优势是把多个工具整合在一起了. 比如整合 ruff, uv 目前看来, 貌似直接用 uv 就行了. |
![]() | 79 lxdlam 2024-09-25 17:48:25 +08:00 ![]() @SimonOne uv 是替代 pip 的,rye 是 flask 作者 mitsuhiko 创始的,他觉得 Python 的研发生态链比起 rust 实在是太烂了,自己搞了一个工具关注整个研发生命周期,使用 独立 python 解释器 + venv + pip + pyproject.toml 等既有生态来管理。后面 astral 团队开发完 uv 之后跟 mitsuhiko 沟通,接管了 rye 项目( https://astral.sh/blog/uv )。 从关系上来说,rye 是一个研发管理工具,基于 project 粒度隔离 python 解释器、venv ,自然也就隔离了包管理生态,uv 跟 pip 在 rye 里可以互换,ruff 也不是强制要求接入。 从我个人体感来说,rye + uv + ruff 就是目前最舒服的方案,我有用来实验的 jupyter 项目,也有打包成 oci 的纯 python 项目,rye 都能非常完美去接入和使用(除了某些模型代码里面写死了 pip 之外)。 P.S.,关于 Python 开发者体验和 rye 本身,mitsuhiko 在 rye 创始之初就有个 discussion ,值得一读: https://github.com/astral-sh/rye/discussions/6 |
![]() | 80 beginor 2024-09-25 21:09:08 +08:00 via Android pip+venv 路过,3.12 之后还不能直接 pip 了,必须先建 venv 才行,venv 从此变成 python 版 node_modules |
![]() | 81 samzong 2024-09-25 23:52:14 +08:00 @SimonOne #78 补充下我的理解,rye 目前比 uv 多了一个系统 python 版本管理的能力,类似 pyenv ; uv 会 find 你系统安装的多个版本的 python ,比如 brew install, pyenv install, rye install ,然后根据你的需求指向对应的版本。 使用之后发现,brew install python [email protected] [email protected] + uv 就很方便了。目前我也不在使用 pyenv 和 rye 了。 而且最近 uv 增加了很多 rye 的功能,那么最终 uv 貌似会往代替 rye 的方向发展 ??? maybe , 一点见解。 |
![]() | 82 lonelyparasol 2024-09-27 17:54:45 +08:00 @itskingname 3.12 版本不少库还没适配吧 |
84 purplemystic 346 天前 @chopin1998519 现在用 uv, 配置 cuda 环境很不美丽, 太大了, cuda 环境还是用的 docker |
85 purplemystic 346 天前 @dcoder #74 rye 会逐步被 uv 替代, 这也是官方的路线 |
86 purplemystic 346 天前 @stobacco 第一次被恶心到, 还是 pipenv, 那个每次不知道等待多久的 locking |
87 chopin1998519 345 天前 @purplemystic #84 不会啊。。。。我就是因为 cuda/torch 这个转过来的。。。docker 。。。。我更不喜欢 |
88 purplemystic 338 天前 @chopin1998519 #87 主要是 cuda, torch 之类的库太大了, 如果每次创建一个虚拟环境, 就下载编译一遍, 就好心累 |
89 chopin1998519 337 天前 ![]() @purplemystic #88 uv 会用硬链接、符号链接、cow 等等 共享相同的版本呀, 所以实际就一份,upgrade 了另说 |
![]() | 90 hellomacos 322 天前 poetry 要是遇到需要同一个依赖,但是需要的版本的不同,那是真的坑。人都傻了 |