V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
einsdisp
V2EX  ›  程序员

Python 除了 Conda 就没有其它的 二进制下载(非源码编译)的版本管理器了吗?

  •  1
     
  •   einsdisp · 217 天前 · 5721 次点击
    这是一个创建于 217 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主流的编程语言, 都有一个的 version manger, (例如 Node 有大名鼎鼎的 NVM), 可以下载并管理编程语言的不同版本, 并且是直接下载 precompiled 二进制的, 不需要编译.

    只有 python, 了解到几个主流的 version manager, 都是下载源码, 还得编译, 还得在 linux 系统中用包管理器安装一堆编译相关依赖(make, gcc 等等一大坨), 甚是蛋疼.

    如果本人有洁癖, 不想在系统中安装一堆编译依赖, 也不想使用臃肿的 anaconda/miniconda, 就没别的选择了吗? 还是我孤陋寡闻了?

    50 条回复    2024-05-04 10:52:55 +08:00
    einsdisp
        1
    einsdisp  
    OP
       217 天前
    备注一下, 本文讨论的是 CPython 的 version manager, 不是 package 的 version manager
    mijazz
        2
    mijazz  
       217 天前
    类 conda 的有 Micromamba 可选;赤裸一点的还有 pyenv (pyenv-win) , 看看有没有顺眼的。

    印象中确实都是用 tarball 现用现 build 。pyenv 里也有 NOTE: Most Pyenv-provided Python releases are source releases and are built from source as part of installation (that's why you need Python build dependencies preinstalled). 要不试试往 asdf 这些方向试试? https://github.com/asdf-community/asdf-python

    不过我一直都是编译几个主要版本就眼不见为净了,arch 系的 base-devel 这些也没有不装的道理。心理安慰一下 CPython 现 build 可以增强 30%

    https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-for-maximum-performance
    lz4261
        3
    lz4261  
       217 天前
    实际上,对于 Python ,也存在能直接安装预编译二进制版的版本管理器工具,这样你就不需要在系统上安装编译依赖。下面列举几个可以考虑使用的 Python 版本管理器:

    1. **pyenv**: 虽然默认情况下 pyenv 会从源代码编译 Python ,但它也支持安装预编译的二进制版本。你可以使用`python-build`插件来安装预编译的 Python 二进制,这样就不需要自己编译了。

    2. **pythonz**: 和 pyenv 类似,pythonz 也可以让你安装预编译的 Python 二进制版本。它会自动处理安装过程,所以你不需要手动编译 Python 。

    3. **conda**: 你提到不想使用 anaconda 或 miniconda ,但实际上它们是非常强大的环境管理和 Python 版本管理工具。conda 包管理器允许你安装来自 Anaconda 仓库的 Python 预编制二进制文件,它们是已经编译好的版本,可以避免依赖问题和编译问题。

    4. **pipx**: 虽然它主要是用来全局安装和隔离 Python 命令行工具的,但它也允许你使用不同的 Python 版本,它会管理虚拟环境而不需要手动设置。

    5. **Windows 上的 py**: windows 有一个 `py` 启动器,可以让你安装多个 Python 版本并且很容易切换。`py` 是 Python 的官方启动器,它会根据你的需求自动选择合适的 Python 解释器版本。

    这些工具都有各自的优势和限制,你可以选择最适合你需求的工具来管理 Python 版本。例如,如果你不想处理任何编译过程并且希望直接从预编译好的版本中选择,使用 conda 可能是比较好的选择。如果你想要一种轻量级的版本管理器,可能 pyenv 的 python-build 插件会是一个合适的选择。

    你还可以考虑使用 Docker 这样的容器化技术,它可以让你在一个隔离的容器中安装 Python 的任何版本,而不会影响到你的系统环境。这样你就可以在不在系统上安装任何编译依赖的情况下,使用不同版本的 Python 。
    -- 以上:来自 GPT-4
    einsdisp
        4
    einsdisp  
    OP
       217 天前   ❤️ 3
    @lz4261
    根本胡扯的答案,也不验证一下就复制过来,误人子弟!
    pyenv, pythonz 根本不支持直接安装装预编译二进制, 都需要编译.
    LeeReamond
        5
    LeeReamond  
       217 天前
    看不太懂 OP 想要干什么,你想预编译直接上 pypi 就能下到预编译二进制文件。只不过可能是因为 cffi 有版本签名还是什么其他的原因,没细研究过,动态链接库不跨版本兼容,再加上跨平台,就只能 CI 维护。所以如果为了保证最大兼容性或者作者懒得写 CI 了那就是下载编译。但是确实是 pip 直接就能带二进制,因为 whl 打包时候 has_ext_modules 就可以引入。你电脑上装个 numpy 难道还本地编译?
    wizardyhnr
        6
    wizardyhnr  
       217 天前
    现在主流的 linux 应该都 maintain 不同的 python 二进制包了,比如 ubuntu 除了默认的系统 python 版本外还有 python3.10 ,python3.11 ,你安装好了配合 pyenv 食用就可以了。
    Jirajine
        7
    Jirajine  
       217 天前
    用 rye , 相当于 rustup for python
    tywtyw2002
        8
    tywtyw2002  
       217 天前 via iPhone
    nix 啊。
    想要哪个版本要哪个版本,py 一般都有 binary cache 的
    brew 只有部分 py 二进制版本。

    pip 装包的有 c lib 的就要看 pip 上面有没有提供 precompile 了。
    phrack
        9
    phrack  
       217 天前 via iPhone
    孤陋寡闻,Python 几十年了还会有你想到了没人想到去解决的问题?全平台单文件的发行版本都有人做,最新的 release 是 4 月 15 号发行的。

    你见过吗?

    另外你知道连 docker 镜像都能编译成单文件吗?

    孤陋寡闻没错,任何人都只知道自己见过的东西,但是你嘴比较臭。我就不给你上链接了,自己找吧。
    Cooky
        10
    Cooky  
       217 天前
    miniconda 很臃肿吗?自带的东西都该带的
    skiy
        11
    skiy  
       217 天前 via iPhone
    同七楼。用 rye…就是 cpython 二进制文件…从 github 下载的,所以得魔法。
    NessajCN
        12
    NessajCN  
       217 天前
    你这个洁癖跟正常人理解的洁癖不太一样啊
    我们能的洁癖都是受不了别人编译好的版本,因为谁知道里面都塞了什么私货预装了什么木马
    当然是自己编译的最安心
    所以极端洁癖都是装 Gentoo 的
    listenfree
        13
    listenfree  
       217 天前
    有洁癖可以在 docker 里面,或者在 github action 里面 pip3 wheel 造轮子,把轮子拿来用进行了。
    1800x
        14
    1800x  
       217 天前 via Android
    venv
    官方自带
    mayli
        15
    mayli  
       217 天前
    就 rye 吧,体验还可以
    bigtear
        16
    bigtear  
       217 天前
    站友开发的 vfox 符合你的需求
    ysc3839
        18
    ysc3839  
       217 天前 via Android
    要官方有提供预编译包才行,Python 官方只提供了 Windows 和 macOS 的预编译包,所以没有
    ysc3839
        19
    ysc3839  
       217 天前 via Android
    @ysc3839 Ubuntu 的话,deadsnakes ppa 源有新版的预编译的 Python 。其他 Linux 发行版似乎就不好找了,可能还是得编译。
    ysc3839
        20
    ysc3839  
       217 天前 via Android
    @ysc3839 突然想起来,Homebrew 也支持 Linux 的,也可以试试 https://formulae.brew.sh/formula/[email protected]
    Akkuman
        21
    Akkuman  
       217 天前 via Android
    @phrack 我目前只知道 python-standalone-build ,看了 rye 的源码发现用的是这个,你说的 docker 编译成单文件是不是 zig 写的一个工具,那个工具前几个月试用过,兼容性挺差的
    moqsien
        22
    moqsien  
       217 天前
    @NessajCN 源码编译就没有可能植入木马?心理安慰而已吧。没有绝对的安全。
    NessajCN
        23
    NessajCN  
       217 天前
    @moqsien 源码我可以自己查啊
    没查出来是我自己菜,技不如人,
    但是二进制没法查,不公平,这就不让人服气了
    feedcode
        24
    feedcode  
       217 天前
    我理解的洁癖是新建一个虚拟机专门做 build ,然后把二进制分发到其他机器

    你这个需求随便找个别人 build 好的下载就行,比如说 rye 下载用的 python-build-standalone git repo
    moqsien
        25
    moqsien  
       217 天前
    @NessajCN 可以的。当你把这些编译器、解释器的代码都看完了,绝对超神。
    h404bi
        26
    h404bi  
       217 天前 via iPhone
    你不喜欢 conda 拖家带口可以选 Linuxbrew, vfox, vmr 都支持直接拉二进制产物,不过 vmr 背后一样还是 conda-forge 的源。
    vmr: https://github.com/gvcgo/version-manager
    NessajCN
        27
    NessajCN  
       217 天前
    @moqsien 查代码又不用一行一行看。你可能没听过 git 这个工具,也不知道 git diff 这个命令,这不怪你。
    ClericPy
        28
    ClericPy  
       217 天前   ❤️ 2
    https://github.com/indygreg/python-build-standalone 这个?目前好使的绿色版解释器就它稳定一些,很多地方没网络就靠这玩意跑程序了。Windows 上直接用 embed 的
    lambdaq
        29
    lambdaq  
       217 天前
    @ClericPy 正在用这个。感觉良好。
    wxf666
        30
    wxf666  
       217 天前
    @NessajCN #23 这么久以来,有通过自己查,避免了什么东西吗?

    想看看有没有必要,尽量少用别人编译好的二进制。。

    moqsien
        31
    moqsien  
       217 天前
    @NessajCN 你好棒
    NessajCN
        32
    NessajCN  
       217 天前 via Android
    @moqsien 确实,好好看好好学
    Jirajine
        33
    Jirajine  
       217 天前
    @NessajCN 就算你 review 所有 diff ,看到这样的 commit message 你会怀疑吗?
    https://github.com/tukaani-project/xz/commit/6e636819e8f070330d835fce46289a3ff72a7b89

    关于二进制安全,你忽视了 bootstrap 和 reproducible ,如果你的平台没有从源码 bootstrap ,可能你的编译器就已经有后门了,编译出来新的编译器及再编译出来的所有二进制都是污染的。或者你下载到的源码包存在专为你准备的后门?
    NoOneNoBody
        34
    NoOneNoBody  
       217 天前
    我明白 OP 的意思,win 有时遇到编译失败的(并非要编译的都失败),报错找不到 cl.exe ,但明明有且在环境变量 PATH 内
    很久以前好象是 3.6 版本时,装那个 keras 就遇到(现在不清楚,换了方案没再用 keras ),还有其他少量包也是,在制作方的 commit 也见到有人反馈,那就并不是我一个人的事

    @einsdisp
    目前还是 miniconda 最好,有些编译不成功的,基本就是包制作方压根没考虑 windows ,只兼容 linux ,那没办法了
    http://winpython.github.io/ 这个你可以看看,py3.4 时代用过,现在还有新版维护,不过记忆中也是臃肿的
    baobao1270
        35
    baobao1270  
       217 天前
    @lz4261 @Livid 使用 AI 生成的内容

    Windows 下你其实可以用官方的 Python ,会自带一个 py.exe ,本身就是版本管理工具。比如 py -3.11 <script>.py 可以这样执行脚本
    macOS 用 Homebrew ,也可以 Homebrew+pynev ,Homebrew 的 pyenv 可以配置切换成使用 Homebrew 预编译的 Python
    Linux 上主流的应该还是 Pyenv ,但是你也可以选择在别的机器上(甚至 GitHub Actions 上)预先编译好然后打包,用的时候直接解压,我就写了一个仓库: https://github.com/baobao1270/pyenv-builds 如果你不放心可以自己 fork 仓库自己用 GitHub Action 编译
    Livid
        36
    Livid  
    MOD
       217 天前
    @baobao1270 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。
    iorilu
        37
    iorilu  
       217 天前
    用 rye 就行了
    ClericPy
        38
    ClericPy  
       217 天前
    @lambdaq
    忘了是不是他们提的 rye 以及以后的大一统 uv 都会用它,不知道有没有后门。速度上没感觉变化,21 世纪了,没必要为了节省一点磁盘或者带宽在本地编译,能绿色版还是绿色版舒服
    lambdaq
        39
    lambdaq  
       217 天前
    @ClericPy 是的。我也喜欢二进制。自己编译麻烦多不说而且性能优化讲究很多
    jqtmviyu
        40
    jqtmviyu  
       217 天前
    我前阵子刚问过这个问题.
    pyenv 足够轻量.
    uv 比 pip 快.
    direnv 自动切换路径
    jqtmviyu
        41
    jqtmviyu  
       217 天前
    @jqtmviyu #40 上面的 miniconda/miniforge 也用过, vscode 不会自动切换虚拟环境, 而且想切换最新的 python3.12 使用自带的联合类型, 结果默认源里最新只有 3.10
    tianshilei1992
        42
    tianshilei1992  
       216 天前
    conda 就是一届毒瘤…里面对于那些 libraries 的管理极其混乱,load 了以后可能会导致各种各样的问题…
    当然不得不承认的是,它确实“方便”…
    einsdisp
        43
    einsdisp  
    OP
       216 天前   ❤️ 1
    @mijazz
    @Jirajine
    @skiy
    @mayli
    @bigtear
    @Akkuman
    @h404bi
    @ClericPy
    @iorilu
    @ClericPy
    @jqtmviyu

    回复楼上诸位, rye 确实满足我需求, 这玩意真是个神器, 背后调用 `indygreg/python-build-standalone` 项目的预编译版本, 除此之外, rye 还自带 pip 的平替包管理器 uv, 也是个神器.

    楼上诸位有很多建议 asdf, vfox, vmr 等多语言版本管理器的, 我看了他们的源代码, 这些没有一个符合要求. 他们要么是调用 pyenv 的 python-build 进行编译安装,要是调用 conda 进行安装.

    总结:
    如果 Linux 下若不想编译安装 Python, 且不污染系统, 不使用 root 权限情况下(排除 docker, 排除系统包管理), 直接安装预编译二进制的,
    **有且只有**唯二的选择:
    conda vs rye, 需要科学计算的选 conda, 不需要的直接选 rye
    noahlias
        44
    noahlias  
       216 天前
    其实不就是 linux 众多发行版的问题吗 说实话给 Linux 发行版做适配是真的很头疼的一件事情
    你既然都选 linux 了还在乎编译给你带来的麻烦吗 你觉得繁琐你用 windows 和 mac 啊
    linux 不就是要把控每一个设置吗 安装位置编译选项等
    kneo
        45
    kneo  
       216 天前 via Android
    @noahlias 你说的这叫什么话。选 Linux 就是图开发方便。谁和你说的是为了折腾?
    你用过 Linux 吗,每装个软件都自己下载源码编译,然后还改安装位置?那我只能说你是闲的。
    noahlias
        46
    noahlias  
       216 天前
    @kneo 肯定用过啊,我喜欢 Linux 的那种自定义,我可以控制我电脑的每一个部分,我可以重新编译内核,可以设定任何一个系统参数,另外你说的为了方便说的是当服务器运行做开发环境?我问一句你真的用过吗?
    kneo
        47
    kneo  
       216 天前 via Android
    @noahlias 请问你控制了你自己电脑的哪个部分?编译了内核,于是,控制了啥?

    你应该不是开发者,不明白如何转换生产力,以为装个 Linux 编译个东西就是学到东西了。那是二十年前学生时代的技术荒漠才有的想法。

    现在是生产力时代,我告诉你开发者会做什么:

    1. 如果你工作了,有大量的业务需求让你去开发。你也可以把前沿技术应用在业务上。
    2. 如果你没工作,是个学生,有大量的开源项目可以让你参与进来。
    3. 如果你不是专业的开发者,你也可以在 PC/安卓/NAS 上为自己开发应用程序。

    开发者会把时间花在具有创造性的事情上。编译一个东西就是编译了一个别人的东西,没有开发者愿意在这上面浪费太多时间。

    也许你是初学者,我不否认你一开始能靠自己编译学到点东西,但是你不会靠反复编译持续学到东西。

    也许你就是闲的喜欢折腾编译。但是你说出的“用 Linux 不就是为了自己编译订制”就很无知。Linux 对开发者是生产力工具。也许对你是“浪费时间工具”。
    noahlias
        48
    noahlias  
       216 天前
    @kneo 我没输出 Linux 为编译定制这个说法啊 你偷换概念 我说的是 Linux 高度自定义,所以有一些开源软件不愿意为这些做 CI pre compile 所以很多提供是源码编译这种方案,300 多种发行版你想想做适配有多么麻烦

    你洋洋洒洒说了一大堆又扯到开发者生产力上了 哈哈哈 还说喜欢折腾编译笑死 我有半句说我喜欢折腾编译吗
    另外不要给别人的话添油加醋 ‘’‘用 Linux 不就是为了自己编译订制’‘’ 这句话我没说过(你太能扯了 xd
    kneo
        49
    kneo  
       216 天前
    @noahlias 哦,那你输出的是啥观点?我回去看了下,你说过的是:

    “你既然都选 linux 了还在乎编译给你带来的麻烦吗 你觉得繁琐你用 windows 和 mac 啊”
    “linux 不就是要把控每一个设置吗 安装位置编译选项等”
    “我喜欢 Linux 的那种自定义”

    你还说

    “我有半句说我喜欢折腾编译吗”

    我说一大堆是为了把我的观点表达清楚。如果你不同意,也可以指出。

    在请问你前面说这么多除了“哈哈哈”“笑死”“你太能扯了”“xd”之外,到底是想表达什么?
    noahlias
        50
    noahlias  
       216 天前
    @kneo 说你太牛了兄弟 总结的神,你不去当辩论队主辩可惜了呀
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2871 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.