V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pl01665077
V2EX  ›  Python

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

  •  
  •   pl01665077 · 2024-09-24 13:11:24 +08:00 · 9605 次点击
    这是一个创建于 366 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    91 条回复    2025-06-05 08:27:25 +08:00
    runinhard
        1
    runinhard  
       2024-09-24 13:14:44 +08:00   ❤️ 4
    是的 ,全他么是垃圾
    dcoder
        2
    dcoder  
       2024-09-24 13:30:00 +08:00
    go.mod / Rust cargo:
    我不是针对你 poetry, 我是说在座的各位 python 包管理, 都是垃圾 ...
    dcoder
        3
    dcoder  
       2024-09-24 13:32:12 +08:00
    认真讨论, Python 的包管理真的太拉胯了...

    说实话, 最近在考虑, 干脆用 conda + lock 得了
    https://github.com/conda/conda-lock

    还方便折腾 AI 的东西
    Mithril
        4
    Mithril  
       2024-09-24 13:32:34 +08:00
    @dcoder 还得加上 .NET NuGet/Java Maven

    NPM:在比烂这方面在座各位没有一个能打的。
    dcoder
        5
    dcoder  
       2024-09-24 13:37:35 +08:00
    @Mithril npm 和 Python 的包管理感觉烂得各有千秋
    最近不太用 JS/Node, npm 那个堪比黑洞质量的文件重复问题,貌似优化了不少了?
    jiayouzl
        6
    jiayouzl  
       2024-09-24 13:39:35 +08:00   ❤️ 6
    pip 适合 99.99%开发者!别搞什么花里胡哨的!我以前就用 virtualenv 后来 Python 自带虚拟环境了我连 virtualenv 都不装了.
    itskingname
        7
    itskingname  
       2024-09-24 13:40:36 +08:00
    Python 3.12 开始,pip 安装就会给你报错缺少 Imp 包。
    cherryas
        8
    cherryas  
       2024-09-24 13:40:52 +08:00
    原生 env 一把梭
    TimePPT
        9
    TimePPT  
    PRO
       2024-09-24 13:56:06 +08:00
    开发环境 poetry ,部署乖乖用 pip...
    SilentOrFight
        10
    SilentOrFight  
       2024-09-24 13:57:33 +08:00
    python 包管理是真的乱
    SenLief
        11
    SenLief  
       2024-09-24 13:57:49 +08:00
    我都是用自带的 venv ,可能项目比较小。
    Goooooos
        12
    Goooooos  
       2024-09-24 14:00:11 +08:00   ❤️ 2
    懒得折腾,都是 conda+pip
    Mogeko
        13
    Mogeko  
       2024-09-24 14:03:14 +08:00 via iPhone
    @dcoder pnpm 基本解决 node_modules 的问题了 python 暂时无解
    Numbcoder
        14
    Numbcoder  
       2024-09-24 14:07:41 +08:00   ❤️ 5
    每次看到有人尬吹 “人生苦短,我用 Python” 我就想笑
    sweat89
        15
    sweat89  
       2024-09-24 14:17:46 +08:00
    我用 conda ,感觉很方便啊
    dishonest
        16
    dishonest  
       2024-09-24 14:21:28 +08:00
    确实是垃圾。不要说包管理不重要,太影响体验了。

    我甚至因为 cargo 的便利,硬学了 rust 。
    encro
        17
    encro  
       2024-09-24 15:20:19 +08:00
    uv 真快。。。
    encro
        18
    encro  
       2024-09-24 15:20:39 +08:00
    pdm 也不错
    FleetingSound
        19
    FleetingSound  
       2024-09-24 15:46:09 +08:00
    poetry 挺好用的,uv 也不错.
    qsnow6
        20
    qsnow6  
       2024-09-24 15:50:05 +08:00
    依赖越少越好
    yolee599
        21
    yolee599  
       2024-09-24 15:53:03 +08:00   ❤️ 3
    python -m venv you_path
    不就行了?
    darksword21
        22
    darksword21  
    PRO
       2024-09-24 16:01:17 +08:00
    能过部署能 pip 最好直接 pip

    conda 也是废物,经常无法 activate ,我在 sagemaker 上部署如果是 conda 的还导致没有日志

    哎 python ,心累
    houzhiqiang
        23
    houzhiqiang  
       2024-09-24 16:04:15 +08:00
    目前在用 pdm ,没有遇到什么问题。pdm 运行慢我是无所谓
    alexsz
        24
    alexsz  
       2024-09-24 16:08:41 +08:00
    用 docker 部署时我都不用 venv
    phithon
        25
    phithon  
       2024-09-24 16:15:01 +08:00
    PEP 668 以后,不用 virtualenv 以后默认不让 pip 装依赖了
    lxdlam
        26
    lxdlam  
       2024-09-24 16:15:09 +08:00
    最近两年都在用 rye ,切到 uv 之后体验丝滑
    lxdlam
        27
    lxdlam  
       2024-09-24 16:16:52 +08:00
    @lxdlam 记忆有偏差,最近一年应该
    R4rvZ6agNVWr56V0
        28
    R4rvZ6agNVWr56V0  
       2024-09-24 16:25:32 +08:00   ❤️ 1
    @Numbcoder 说这话的时候,还没有 go 、rust 什么事儿呢。抛开历史看问题你是会的。
    coolair
        29
    coolair  
       2024-09-24 16:25:55 +08:00
    用 uv ,一步到位。
    pckillers
        30
    pckillers  
       2024-09-24 16:27:09 +08:00   ❤️ 1
    都用 docker 了,自然直接 pip 全局安装啦。做好 image 版本备份,连 venv 都用不到。
    R4rvZ6agNVWr56V0
        31
    R4rvZ6agNVWr56V0  
       2024-09-24 16:37:12 +08:00
    从 09 年开始就用 pip ,用了十多年了,没啥问题啊。 哈哈哈哈。操作姿势很重要。当然 Windows 平台除外。
    siteshen
        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
    youngce
        33
    youngce  
       2024-09-24 18:04:52 +08:00
    venv + requirments.txt 。。。
    noqwerty
        34
    noqwerty  
       2024-09-24 18:41:17 +08:00 via iPhone
    micromamba/uv 目前为止没遇到解决不了的
    NoOneNoBody
        35
    NoOneNoBody  
       2024-09-24 18:54:12 +08:00   ❤️ 2
    一个包 A 存在依赖 B ,用这个 A 去管理其他的,这本来就是个危险的事,除非能保证 AB 同步
    包 A 没有依赖,或者说仅依赖原生,才是相对安全的选择

    框架也是类似逻辑,生活中很多事也是这个逻辑,依赖的东西应该仅限于方便行动,而不是方便掌控
    txx
        36
    txx  
       2024-09-24 21:39:30 +08:00
    @dcoder AI 的东西直接上 nvidia 的 pytorch 的 docker ,cuda 什么的都配好了,开箱即用。
    ClericPy
        37
    ClericPy  
       2024-09-24 21:59:53 +08:00
    除了现在的 uv ,其他的全用了一遍,有的在生产环境遇到 bug (虽然提了以后作者修了),最后还是 venv 就够了。。。
    至于发包,打包成 zipapp 也不耽误,执行环境还是 venv 省事
    Vegetable
        38
    Vegetable  
       2024-09-24 22:04:43 +08:00
    哪有在容器里边再构建虚拟环境得道理? poetry export 为 requirements.txt ,然后容器里直接 pip 才对。

    poetry 最大的问题是慢,不过我也早就跑路到 rye 了
    so1n
        39
    so1n  
       2024-09-24 22:28:54 +08:00
    poetry,pdm 都是本地用啊,线上还是导出 requirements 把
    JZ8ZW193q6W9Awgy
        40
    JZ8ZW193q6W9Awgy  
       2024-09-24 22:32:45 +08:00
    @jiayouzl #6 我新手,觉得 pip+自带的 venv 也蛮好用的。。。
    Elaina
        41
    Elaina  
       2024-09-25 00:22:34 +08:00
    @coolair uv 相比 poetry 有什么优点吗,其他的貌似我都用过,就是没用过 uv😂
    Trim21
        42
    Trim21  
       2024-09-25 01:09:42 +08:00   ❤️ 1
    因为 pip 没法有外部依赖,所以直接把他用到的依赖给 vendor 了,所以等你好久不升级 pip ,pip 告诉你版本太旧装不了新依赖的时候你只需要升级 pip 就行。

    poetry 没 vendor ,所以你还需要升级 poetry 的依赖。
    donglintong
        43
    donglintong  
       2024-09-25 02:08:37 +08:00
    uv +1
    jqtmviyu
        44
    jqtmviyu  
       2024-09-25 02:59:41 +08:00
    uv +1

    ```sh
    # 安装
    uv pip install -r requirements.txt
    # 导出
    uv pip freeze > requirements.txt
    ```
    mayli
        45
    mayli  
       2024-09-25 03:55:34 +08:00   ❤️ 1
    rye 好,快去用。
    自从用了 rye ,我整个人的毒性都降低了,就感觉快
    lgh
        46
    lgh  
       2024-09-25 07:32:48 +08:00 via iPhone
    在用 pdm ,暂时没有想换的理由。

    楼上好多人把环境隔离和依赖管理混为一谈的。

    用 pip 最大的问题还是直接依赖和间接依赖的区别。如果不用 pdm 的时候我会用 requirements.txt 管理直接依赖、再 freeze 成 requirements-lock.txt ,否则要升级某个库的时候简直想死。
    hanxiV2EX
        47
    hanxiV2EX  
       2024-09-25 07:48:04 +08:00 via Android
    pdm 真爽,用了回不去了。
    qwq11
        48
    qwq11  
       2024-09-25 08:41:01 +08:00 via iPad
    uv+1
    coolair
        49
    coolair  
       2024-09-25 08:47:01 +08:00
    @Elaina #40 uv 是终点站。
    tairan2006
        50
    tairan2006  
       2024-09-25 08:51:05 +08:00
    conda+pip

    跑 docker 的话直接装全局就行
    kaktos
        51
    kaktos  
       2024-09-25 08:57:13 +08:00
    无脑上 uv ,其他看都不要看
    bianjp
        52
    bianjp  
    PRO
       2024-09-25 09:13:49 +08:00
    poetry 不支持全局配置使用国内的 PyPI 镜像站挺不方便的,官方一直不愿意做这个功能。
    wryyyyyyyyyyyy
        53
    wryyyyyyyyyyyy  
       2024-09-25 09:21:55 +08:00
    @encro pdm 综合使用体验感觉还不如 poetry ,吹的 pep 提出的那个特性被否了,没通过。
    pl01665077
        54
    pl01665077  
    OP
       2024-09-25 09:47:34 +08:00
    @dcoder 做 web 项目不太习惯用 conda ,嘿嘿
    pl01665077
        55
    pl01665077  
    OP
       2024-09-25 09:49:06 +08:00
    @jiayouzl 那也是,不过有时安装新的包总是忘记 pip freeze 等等。。。
    pl01665077
        56
    pl01665077  
    OP
       2024-09-25 09:52:10 +08:00
    @dishonest rust 我也会,不过 cargo 的源要配置国内源会方便点,一开始配置还挺麻烦的。。。
    uni
        57
    uni  
       2024-09-25 09:52:57 +08:00
    uvuvuv
    pl01665077
        58
    pl01665077  
    OP
       2024-09-25 09:53:32 +08:00
    @GeekGao 谢谢分享经历,哈哈,pip 还是稳
    pl01665077
        59
    pl01665077  
    OP
       2024-09-25 09:54:01 +08:00
    @siteshen 对,pipenv 自动更新依赖很讨厌。
    pl01665077
        60
    pl01665077  
    OP
       2024-09-25 09:54:42 +08:00
    @NoOneNoBody 对的,非常赞同!
    pl01665077
        61
    pl01665077  
    OP
       2024-09-25 09:57:10 +08:00
    @Vegetable poetry 也可以不用虚拟环境安装的,直接在容器里面全局安装。dockerfile 使用 poetry 主要是保持开发和生产环境一致性,而且开发时只需要 poetry install ,部署时省去很多导出 requirements.txt 步骤
    pl01665077
        62
    pl01665077  
    OP
       2024-09-25 10:02:39 +08:00
    @lgh 是手写 requirements.tx 管理依赖,freeze 生成 requirements-lock.txt 依赖吗?学习了
    edisonwong
        63
    edisonwong  
       2024-09-25 10:03:30 +08:00
    最舒心的是 go mod ,不过也有遇到管理 etcd 包一坨 shit 的时候(那是因为作者反 go mod 一直不修); npm 是一坨,yarn ,pnpm ( workspace )反正前端每次构建都是个玄学; python 也好不到哪里去哈哈哈
    lambdaq
        64
    lambdaq  
       2024-09-25 10:08:33 +08:00   ❤️ 1
    觉得 pip 垃圾的,因为很多东西是 .so 的东西导致的。

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

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

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

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


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

    不过也遇到一个环境, 没法用, 单独给它开个 venv 。。。
    wupher
        67
    wupher  
       2024-09-25 10:51:46 +08:00
    uv + 1

    Rust 完善工具链方面,真是没说的。
    pl01665077
        68
    pl01665077  
    OP
       2024-09-25 10:59:50 +08:00
    @chopin1998519 对,每换个环境都重新来一次 pip+venv 太繁琐了,所以喜欢用 poetry install 一下就创建好了。
    全局 pip 还是不太好,每个项目版本依赖不一样。
    sickoo
        69
    sickoo  
       2024-09-25 11:06:21 +08:00
    uv ? 我去看看 真的那么好用吗?
    jiayouzl
        70
    jiayouzl  
       2024-09-25 11:11:43 +08:00
    @pl01665077 养成个习惯,在 git push 的时候就维护下 requirements.txt 就行了.
    stobacco
        71
    stobacco  
       2024-09-25 11:32:41 +08:00
    我也是和楼主一样的历程,被 python 包管理弄得心态炸过几次,导致我现在都害怕包管理这个玩意儿 比如 node 、go 的,我没学它们之前以为和 python 包管理一样乱。。。
    dcoder
        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 的话,哪个更好?
    yb2313
        73
    yb2313  
       2024-09-25 11:37:33 +08:00
    有的项目用 poetry 安装一装一个报错, 还是用 uv 吧, rye 也是用的 uv
    dcoder
        74
    dcoder  
       2024-09-25 11:40:42 +08:00
    @yb2313 查了下, rye 确实用的 uv. 那用 rye 优势是啥
    foyoux
        75
    foyoux  
       2024-09-25 12:41:56 +08:00
    pip + venv

    pip freeze > requirements.txt
    dcoder
        76
    dcoder  
       2024-09-25 13:05:35 +08:00
    看了下 rye ,优势是把多个工具整合在一起了. 比如整合 ruff, uv
    目前看来, 貌似直接用 uv 就行了.
    leoking6
        77
    leoking6  
       2024-09-25 13:25:45 +08:00 via iPhone
    @dcoder 优势就是万金油吧。环境管理、版本管理、包管理、打包,全都集合在一起了。
    SimonOne
        78
    SimonOne  
       2024-09-25 13:27:44 +08:00
    @lxdlam #26 rye 和 uv 啥关系啊,有点搞不懂,uv 开发团队接管了 rye
    lxdlam
        79
    lxdlam  
       2024-09-25 17:48:25 +08:00   ❤️ 4
    @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
        80
    beginor  
       364 天前 via Android
    pip+venv 路过,3.12 之后还不能直接 pip 了,必须先建 venv 才行,venv 从此变成 python 版 node_modules
    samzong
        81
    samzong  
       364 天前
    @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 , 一点见解。
    lonelyparasol
        82
    lonelyparasol  
       363 天前
    @itskingname 3.12 版本不少库还没适配吧
    twig
        83
    twig  
       350 天前 via iPhone
    @Numbcoder 越用 Python 越短
    purplemystic
        84
    purplemystic  
       332 天前
    @chopin1998519 现在用 uv, 配置 cuda 环境很不美丽, 太大了, cuda 环境还是用的 docker
    purplemystic
        85
    purplemystic  
       332 天前
    @dcoder #74 rye 会逐步被 uv 替代, 这也是官方的路线
    purplemystic
        86
    purplemystic  
       332 天前
    @stobacco 第一次被恶心到, 还是 pipenv, 那个每次不知道等待多久的 locking
    chopin1998519
        87
    chopin1998519  
       331 天前
    @purplemystic #84 不会啊。。。。我就是因为 cuda/torch 这个转过来的。。。docker 。。。。我更不喜欢
    purplemystic
        88
    purplemystic  
       324 天前
    @chopin1998519 #87 主要是 cuda, torch 之类的库太大了, 如果每次创建一个虚拟环境, 就下载编译一遍, 就好心累
    chopin1998519
        89
    chopin1998519  
       323 天前   ❤️ 1
    @purplemystic #88 uv 会用硬链接、符号链接、cow 等等 共享相同的版本呀, 所以实际就一份,upgrade 了另说
    hellomacos
        90
    hellomacos  
       307 天前
    poetry 要是遇到需要同一个依赖,但是需要的版本的不同,那是真的坑。人都傻了
    sonforest
        91
    sonforest  
       112 天前
    @Mithril 看不起我 composer 吗?绝对有办法让你抓狂
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3127 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 11:40 · PVG 19:40 · LAX 04:40 · JFK 07:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.