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
jqtmviyu
V2EX  ›  Python

请教下 Python 上的包管理器和虚拟环境

  •  
  •   jqtmviyu · 2024-04-12 21:30:10 +08:00 · 7271 次点击
    这是一个创建于 380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚学 python, 对这方面不是很了解. 对 npm 比较熟悉, 所以拿 npm 来类比.

    1. 流行的 python 版本管理器是 pyenv 吗? 类似 nodejs 上的 fnm n nvm
    2. 流行的 env 环境是 3.3 开始自带的 venv 吗? 还是 poetry (感觉用起来很麻烦)
    3. 有类似 pnpm 使用硬链接减少磁盘占用的方案吗?
    4. 有办法让 shell(zsh) 进入目录自动 activate env 吗? 类似识别 .nvmrc 文件自动切换

    目前是使用 pyenv + venv

    1. vscode 能自动切换版本, 但 shell 方案没找到
    2. pyvenv.cfg里都是绝对路径,python 版本或者项目改名/移动路径岂不是很麻烦
    3. 测试新建项目, pip install -r requirements.txt 又从网络重下了一遍

    是我搜索能力太差还是本来就这样, 怎么感觉比 js 生态还原始.

    45 条回复    2024-05-10 16:26:00 +08:00
    AilF
        1
    AilF  
       2024-04-12 21:37:16 +08:00
    python 包管理和虚拟环境工具还是挺多的,可参考:
    https://alpopkes.com/posts/python/packaging_tools/
    ysc3839
        2
    ysc3839  
       2024-04-12 21:37:34 +08:00 via Android
    1. 个人感觉 pyenv 没那么流行,因为 pyenv 要在本机编译,会很耗时。要用系统包管理没提供的版本的话,Ubuntu 可以用 deadsnakes ppa 源,macOS 可以用 Homebrew ,其他系统如 CentOS 可以用通用的 MiniConda 。
    2. 我自己是习惯用 venv 。
    3. 似乎无?
    linvaux
        3
    linvaux  
       2024-04-12 21:39:47 +08:00
    直接用 miniconda 不就好了
    NessajCN
        4
    NessajCN  
       2024-04-12 21:40:16 +08:00
    用这个吧
    https://github.com/astral-sh/uv
    自动 source 就在 .zshrc 里加 . .venv/bin/activate
    AilF
        5
    AilF  
       2024-04-12 21:40:25 +08:00   ❤️ 2
    最近又出了个 uv ,速度特别快,但我习惯用国内作者开源的 pdm
    Jirajine
        6
    Jirajine  
       2024-04-12 21:48:00 +08:00
    js 生态可不原始,一直都是最具活力的生态。
    python 现在现代的工具链就 rye 吧 https://rye-up.com/
    相当于 rustup for python 。
    crackidz
        7
    crackidz  
       2024-04-12 22:14:57 +08:00
    1. shell 里 pyenv 支持 .python-version 文件指定 Python 版本,但是大部分时间一下其实不是选择版本而是激活虚拟环境
    2. poetry 使用起来常用命令并不多,最多的还是 poetry add == npm add --save ...
    3. 没有
    BBCCBB
        8
    BBCCBB  
       2024-04-12 22:36:51 +08:00
    环境管理用 miniconda, 注入配置后是可以进去到对应目录自动切换 shell 环境的
    coolair
        9
    coolair  
       2024-04-12 22:43:53 +08:00 via Android   ❤️ 1
    说句实话,现在 python 的虚拟环境管理没有一个好用的,如果不用切换 python 版本,就用自带的 venv 。
    等哪天 rye 完成历史使命了,功能合并到 uv 里去了,就用 uv 吧。
    chengxiao
        10
    chengxiao  
       2024-04-12 22:51:00 +08:00
    pip 一把梭 虽然 python 的包管理狗屎但是也比 npm 好......
    另外 python 包的小心比 npm 占用要小的多的多
    yolee599
        11
    yolee599  
       2024-04-12 23:18:25 +08:00 via Android   ❤️ 1
    喜欢用自带的 venv ,如无必要,勿增实体
    mikaelson
        12
    mikaelson  
       2024-04-12 23:19:28 +08:00
    以前我也很爱用 pyenv
    后来我用了 conda ,回不去了
    zcf0508
        13
    zcf0508  
       2024-04-12 23:29:37 +08:00 via Android
    用 rye
    paopjian
        14
    paopjian  
       2024-04-12 23:30:00 +08:00
    我更奇葩,miniconda 装 python,再用 venv 启动虚拟环境,activate 后 pip 装包
    Alliot
        15
    Alliot  
       2024-04-12 23:35:33 +08:00 via Android
    😳一直 venv pip 的路过。。。
    jqtmviyu
        16
    jqtmviyu  
    OP
       2024-04-13 06:53:41 +08:00
    @chengxiao #10 3.? 后面不让一把梭, 强制要开隔离环境. 然后我就开始注意到包的版本隔离问题和离线缓存问题.
    zhanghua0
        17
    zhanghua0  
       2024-04-13 07:33:26 +08:00
    我现在倒是用的 poetry ,好处就是不用自己花心思在虚拟环境上,它会维护虚拟环境,想进虚拟环境执行 poetry shell 就行,但平时反而不需要这么做,因为它其实是打开一个虚拟环境里面的 shell 。如果仅仅是执行虚拟环境里面的某个指令只需要 poetry run xxx 这样就行。
    ShawnSky
        18
    ShawnSky  
       2024-04-13 08:08:15 +08:00 via iPhone
    Conda 一把梭
    jqtmviyu
        19
    jqtmviyu  
    OP
       2024-04-13 08:28:34 +08:00
    @NessajCN #4 看起来前景不错, 但我遇到一个问题, 似乎不支持设置镜像, --trusted-host 还在讨论中
    1800ml
        20
    1800ml  
       2024-04-13 09:35:57 +08:00
    miniconda
    selfeasy
        21
    selfeasy  
       2024-04-13 11:02:36 +08:00
    在尝试使用 rye ,但 vscode 不能自动识别 rye 安装的 python 解释器
    knightdf
        22
    knightdf  
       2024-04-13 11:25:44 +08:00
    poetry+pyenv
    l1xnan
        23
    l1xnan  
       2024-04-13 11:34:26 +08:00
    rye + uv + ruff 用起来还算流畅
    julyclyde
        24
    julyclyde  
       2024-04-13 12:08:53 +08:00
    1 以 python 的发展速度,似乎多版本管理器并没什么价值啊?
    4 那其实开销更大,需要在 PS1 里做手脚吧
    Easedge
        25
    Easedge  
       2024-04-13 14:31:42 +08:00
    第四个问题 direnv 可以做到,非常简单
    qYs9wxnXG96c6z1t
        26
    qYs9wxnXG96c6z1t  
       2024-04-13 15:45:31 +08:00 via iPhone
    我一般是 pyenv + pipenv
    imycc
        27
    imycc  
       2024-04-13 16:08:33 +08:00
    就我个人而言,pyenv + pyenv 的 virtualenv 就足够。
    pyenv virtualenv 的组合很方便,在项目目录下设置下 pyenv local 指定你要用的 venv ,vscode 之类的可能也要选一下,设置一次之后就没有什么烦恼了。
    zzhaolei
        28
    zzhaolei  
       2024-04-13 18:37:30 +08:00
    4 可以自己设置 zsh 的 cd hook ,当发现当前目录有 venv 或者 .venv 就自动 source
    574402766
        29
    574402766  
       2024-04-13 19:05:07 +08:00
    4 pyenv 和 conda 应该都能做到
    iorilu
        30
    iorilu  
       2024-04-13 19:08:17 +08:00
    自己玩玩可以折腾

    如果正式环境或公司开发建议用 miniconda, 不建议花时间在折腾这事上面
    jqtmviyu
        32
    jqtmviyu  
    OP
       2024-04-14 17:04:20 +08:00
    @zhanghua0 #17 poetry 似乎会绑定当前的 python 环境, 官方文档也说需要单独提供环境.

    这可能导致问题就是, 你在 3.12.1 安装的 poetry, 后来升级到 3.12.2, 它还是绑定的 3.12.1, 你不能卸载了它.
    jqtmviyu
        33
    jqtmviyu  
    OP
       2024-04-14 17:36:09 +08:00
    @zzhaolei #28 不错. chpwd 钩子
    jqtmviyu
        34
    jqtmviyu  
    OP
       2024-04-14 17:40:30 +08:00
    @Easedge #25 非常棒, 会自动加载卸载, 更简便了.
    jqtmviyu
        35
    jqtmviyu  
    OP
       2024-04-14 20:26:24 +08:00
    感谢楼上的各位: 暂时采纳 pyenv + uv + direnv

    pyenv 管理版本
    uv 代替 pip, 会优先使用本地缓存
    direnv 自动激活 venv
    mingwiki
        36
    mingwiki  
       2024-04-15 09:26:58 +08:00
    @yolee599 #11 最近发现 wsl2 里面的 venv 无法隔离环境,换了 virtualenv 才好。服务器里面的 venv 是正常的。所以推荐 virtualenv
    supergeek1
        37
    supergeek1  
       2024-04-15 09:39:19 +08:00
    @paopjian 差不多的流程,不过我是用的 micromamba 装 python
    mMartin
        38
    mMartin  
       2024-04-15 10:04:34 +08:00
    用 miniforge https://github.com/conda-forge/miniforge 用清华源 mamba 装包快的一批,我们自建了 conda 源
    frostming
        39
    frostming  
       2024-04-15 10:45:06 +08:00
    3. 有类似 pnpm 使用硬链接减少磁盘占用的方案吗?

    再说三遍

    pdm 支持
    pdm 支持
    pdm 支持

    很遗憾没人知道
    zhanghua0
        40
    zhanghua0  
       2024-04-15 17:26:54 +08:00
    @jqtmviyu #32 确实,不过我是在 Linux 这边,poetry 的更新都是交给软件包管理器的,所以这个问题影响不大,Python 更新的时候 poetry 也会一起被更新。
    Windows 那边估计真只能自己维护一下每次 Python 更新也要重新装一遍 poetry 了。
    iorilu
        41
    iorilu  
       2024-04-19 20:07:36 +08:00
    @jqtmviyu 那你真不如用哪个 rye 了, 内部用的 uv, 自带安装各版本 python, 何必弄好几个东西
    jqtmviyu
        42
    jqtmviyu  
    OP
       2024-04-19 23:21:32 +08:00
    @iorilu #41 哈哈, 我讨厌使用另外的一套命令. 特别是类似 poetry run 那种.
    miniconda 和 miniforge 也用不习惯. 习惯了自带的.venv 挺好用的. vscode 支持自动切换.
    pyKane
        43
    pyKane  
       2024-04-20 22:33:29 +08:00   ❤️ 1
    想不明白上面都弄的那么复杂干嘛。
    包管理用 pip
    虚拟环境用自带的 venv
    咋就满足不了你们的需求了呢。
    多版本无非就是在系统里多装个不同版本的 Python ,然后在你的项目里 创建你需要的版本的 Python venv 环境就行了。开发哪个项目就过时去 source .venv/bin/activate 就开始干少顾。不是挺好么 pyCharm 对 venv 兼容性也非常好。
    对于新手来上,就用上面两个就行了。别整太复杂了,用 Python 就是为了干活的。不是折腾的。
    yucongo
        44
    yucongo  
       2024-04-28 08:49:15 +08:00
    rye + uv: 又快有好。其实 rye 本身已经实验性直接植入 uv 了
    FkingMan
        45
    FkingMan  
       353 天前
    pyenv 就可以管理 python 版本和创建虚拟环境,不太需要 venv
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:26 · PVG 17:26 · LAX 02:26 · JFK 05:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.