也是醉了,从 pip 学习到 pipenv,再切换到 poetry,最后还是用回 pip

170 天前
 pl01665077

也是醉了,最近使用 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

7924 次点击
所在节点    Python
90 条回复
pl01665077
169 天前
@Vegetable poetry 也可以不用虚拟环境安装的,直接在容器里面全局安装。dockerfile 使用 poetry 主要是保持开发和生产环境一致性,而且开发时只需要 poetry install ,部署时省去很多导出 requirements.txt 步骤
pl01665077
169 天前
@lgh 是手写 requirements.tx 管理依赖,freeze 生成 requirements-lock.txt 依赖吗?学习了
edisonwong
169 天前
最舒心的是 go mod ,不过也有遇到管理 etcd 包一坨 shit 的时候(那是因为作者反 go mod 一直不修); npm 是一坨,yarn ,pnpm ( workspace )反正前端每次构建都是个玄学; python 也好不到哪里去哈哈哈
lambdaq
169 天前
觉得 pip 垃圾的,因为很多东西是 .so 的东西导致的。

其他语言包管理不是强,而是原生性能能支持 99%的功能纯语言实现了 但凡你 cgo JNI 搞进去,依赖管理也会变得复杂。

纯.py 的包管理复杂吗?一点都不复杂。直接全部复制到项目 lib 目录就 vendoring 了。什么版本管理冲突安装失败,不存在的。举个例子,以前 requests 就是这样复制了一套 urllib3 打包一起的。
Trim21
169 天前
poetry 有 export ,你 poetry export -f requirements.txt --output requirements.txt 然后用 pip 装不就是了,还能减少 镜像层数。。。
chopin1998519
169 天前
我用了十年 python , 一直都是 sudo pip 的。。。。

知道最近项目实在太杂,互相依赖玩儿崩了, 老老实实用了曾经嗤之以鼻的 venv+pip ,

但是每个环境都重新来一次 nv 的那一大坨库实在不舒服。。。。


比较了一下 pdm/ uv , 目前选了 uv , 简单用了一下还是挺舒服的。。。

不过也遇到一个环境, 没法用, 单独给它开个 venv 。。。
wupher
169 天前
uv + 1

Rust 完善工具链方面,真是没说的。
pl01665077
169 天前
@chopin1998519 对,每换个环境都重新来一次 pip+venv 太繁琐了,所以喜欢用 poetry install 一下就创建好了。
全局 pip 还是不太好,每个项目版本依赖不一样。
sickoo
169 天前
uv ? 我去看看 真的那么好用吗?
jiayouzl
169 天前
@pl01665077 养成个习惯,在 git push 的时候就维护下 requirements.txt 就行了.
stobacco
169 天前
我也是和楼主一样的历程,被 python 包管理弄得心态炸过几次,导致我现在都害怕包管理这个玩意儿 比如 node 、go 的,我没学它们之前以为和 python 包管理一样乱。。。
dcoder
169 天前
从这帖子里听说了 rye, uv
看了下, 都是 Rust 写的, 2023 才出来的新项目, git star: rye (13.6k), uv (20.9k)
好嘛, python 包管理真热闹, 没完没了了,是不是 XD

用来代替 conda 的话,哪个更好?
yb2313
169 天前
有的项目用 poetry 安装一装一个报错, 还是用 uv 吧, rye 也是用的 uv
dcoder
169 天前
@yb2313 查了下, rye 确实用的 uv. 那用 rye 优势是啥
foyoux
169 天前
pip + venv

pip freeze > requirements.txt
dcoder
169 天前
看了下 rye ,优势是把多个工具整合在一起了. 比如整合 ruff, uv
目前看来, 貌似直接用 uv 就行了.
leoking6
169 天前
@dcoder 优势就是万金油吧。环境管理、版本管理、包管理、打包,全都集合在一起了。
SimonOne
169 天前
@lxdlam #26 rye 和 uv 啥关系啊,有点搞不懂,uv 开发团队接管了 rye
lxdlam
168 天前
@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
beginor
168 天前
pip+venv 路过,3.12 之后还不能直接 pip 了,必须先建 venv 才行,venv 从此变成 python 版 node_modules

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

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

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

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

© 2021 V2EX