主流的编程语言, 都有一个的 version manger, (例如 Node 有大名鼎鼎的 NVM), 可以下载并管理编程语言的不同版本, 并且是直接下载 precompiled 二进制的, 不需要编译.
只有 python, 了解到几个主流的 version manager, 都是下载源码, 还得编译, 还得在 linux 系统中用包管理器安装一堆编译相关依赖(make, gcc 等等一大坨), 甚是蛋疼.
如果本人有洁癖, 不想在系统中安装一堆编译依赖, 也不想使用臃肿的 anaconda/miniconda, 就没别的选择了吗? 还是我孤陋寡闻了?
1
einsdisp OP 备注一下, 本文讨论的是 CPython 的 version manager, 不是 package 的 version manager
|
2
mijazz 238 天前
类 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 |
3
lz4261 238 天前
实际上,对于 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 |
5
LeeReamond 238 天前
看不太懂 OP 想要干什么,你想预编译直接上 pypi 就能下到预编译二进制文件。只不过可能是因为 cffi 有版本签名还是什么其他的原因,没细研究过,动态链接库不跨版本兼容,再加上跨平台,就只能 CI 维护。所以如果为了保证最大兼容性或者作者懒得写 CI 了那就是下载编译。但是确实是 pip 直接就能带二进制,因为 whl 打包时候 has_ext_modules 就可以引入。你电脑上装个 numpy 难道还本地编译?
|
6
wizardyhnr 238 天前
现在主流的 linux 应该都 maintain 不同的 python 二进制包了,比如 ubuntu 除了默认的系统 python 版本外还有 python3.10 ,python3.11 ,你安装好了配合 pyenv 食用就可以了。
|
7
Jirajine 238 天前
用 rye , 相当于 rustup for python
|
8
tywtyw2002 238 天前 via iPhone
nix 啊。
想要哪个版本要哪个版本,py 一般都有 binary cache 的 brew 只有部分 py 二进制版本。 pip 装包的有 c lib 的就要看 pip 上面有没有提供 precompile 了。 |
9
phrack 238 天前 via iPhone
孤陋寡闻,Python 几十年了还会有你想到了没人想到去解决的问题?全平台单文件的发行版本都有人做,最新的 release 是 4 月 15 号发行的。
你见过吗? 另外你知道连 docker 镜像都能编译成单文件吗? 孤陋寡闻没错,任何人都只知道自己见过的东西,但是你嘴比较臭。我就不给你上链接了,自己找吧。 |
10
Cooky 238 天前
miniconda 很臃肿吗?自带的东西都该带的
|
11
skiy 238 天前 via iPhone
同七楼。用 rye…就是 cpython 二进制文件…从 github 下载的,所以得魔法。
|
12
NessajCN 238 天前
你这个洁癖跟正常人理解的洁癖不太一样啊
我们能的洁癖都是受不了别人编译好的版本,因为谁知道里面都塞了什么私货预装了什么木马 当然是自己编译的最安心 所以极端洁癖都是装 Gentoo 的 |
13
listenfree 238 天前
有洁癖可以在 docker 里面,或者在 github action 里面 pip3 wheel 造轮子,把轮子拿来用进行了。
|
14
1800x 238 天前 via Android
venv
官方自带 |
15
mayli 238 天前
就 rye 吧,体验还可以
|
16
bigtear 238 天前
站友开发的 vfox 符合你的需求
|
18
ysc3839 238 天前 via Android
要官方有提供预编译包才行,Python 官方只提供了 Windows 和 macOS 的预编译包,所以没有
|
19
ysc3839 238 天前 via Android
@ysc3839 Ubuntu 的话,deadsnakes ppa 源有新版的预编译的 Python 。其他 Linux 发行版似乎就不好找了,可能还是得编译。
|
20
ysc3839 238 天前 via Android
@ysc3839 突然想起来,Homebrew 也支持 Linux 的,也可以试试 https://formulae.brew.sh/formula/[email protected]
|
21
Akkuman 238 天前 via Android
@phrack 我目前只知道 python-standalone-build ,看了 rye 的源码发现用的是这个,你说的 docker 编译成单文件是不是 zig 写的一个工具,那个工具前几个月试用过,兼容性挺差的
|
24
feedcode 238 天前
我理解的洁癖是新建一个虚拟机专门做 build ,然后把二进制分发到其他机器
你这个需求随便找个别人 build 好的下载就行,比如说 rye 下载用的 python-build-standalone git repo |
26
h404bi 238 天前 via iPhone
你不喜欢 conda 拖家带口可以选 Linuxbrew, vfox, vmr 都支持直接拉二进制产物,不过 vmr 背后一样还是 conda-forge 的源。
vmr: https://github.com/gvcgo/version-manager |
28
ClericPy 238 天前 2
https://github.com/indygreg/python-build-standalone 这个?目前好使的绿色版解释器就它稳定一些,很多地方没网络就靠这玩意跑程序了。Windows 上直接用 embed 的
|
33
Jirajine 238 天前
@NessajCN 就算你 review 所有 diff ,看到这样的 commit message 你会怀疑吗?
https://github.com/tukaani-project/xz/commit/6e636819e8f070330d835fce46289a3ff72a7b89 关于二进制安全,你忽视了 bootstrap 和 reproducible ,如果你的平台没有从源码 bootstrap ,可能你的编译器就已经有后门了,编译出来新的编译器及再编译出来的所有二进制都是污染的。或者你下载到的源码包存在专为你准备的后门? |
34
NoOneNoBody 238 天前
我明白 OP 的意思,win 有时遇到编译失败的(并非要编译的都失败),报错找不到 cl.exe ,但明明有且在环境变量 PATH 内
很久以前好象是 3.6 版本时,装那个 keras 就遇到(现在不清楚,换了方案没再用 keras ),还有其他少量包也是,在制作方的 commit 也见到有人反馈,那就并不是我一个人的事 @einsdisp 目前还是 miniconda 最好,有些编译不成功的,基本就是包制作方压根没考虑 windows ,只兼容 linux ,那没办法了 http://winpython.github.io/ 这个你可以看看,py3.4 时代用过,现在还有新版维护,不过记忆中也是臃肿的 |
35
baobao1270 238 天前
@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 编译 |
36
Livid MOD @baobao1270 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。
|
37
iorilu 238 天前
用 rye 就行了
|
38
ClericPy 238 天前
@lambdaq
忘了是不是他们提的 rye 以及以后的大一统 uv 都会用它,不知道有没有后门。速度上没感觉变化,21 世纪了,没必要为了节省一点磁盘或者带宽在本地编译,能绿色版还是绿色版舒服 |
40
jqtmviyu 238 天前
我前阵子刚问过这个问题.
pyenv 足够轻量. uv 比 pip 快. direnv 自动切换路径 |
41
jqtmviyu 238 天前
@jqtmviyu #40 上面的 miniconda/miniforge 也用过, vscode 不会自动切换虚拟环境, 而且想切换最新的 python3.12 使用自带的联合类型, 结果默认源里最新只有 3.10
|
42
tianshilei1992 237 天前
conda 就是一届毒瘤…里面对于那些 libraries 的管理极其混乱,load 了以后可能会导致各种各样的问题…
当然不得不承认的是,它确实“方便”… |
43
einsdisp OP @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 |
44
noahlias 237 天前
其实不就是 linux 众多发行版的问题吗 说实话给 Linux 发行版做适配是真的很头疼的一件事情
你既然都选 linux 了还在乎编译给你带来的麻烦吗 你觉得繁琐你用 windows 和 mac 啊 linux 不就是要把控每一个设置吗 安装位置编译选项等 |
45
kneo 237 天前 via Android
@noahlias 你说的这叫什么话。选 Linux 就是图开发方便。谁和你说的是为了折腾?
你用过 Linux 吗,每装个软件都自己下载源码编译,然后还改安装位置?那我只能说你是闲的。 |
46
noahlias 237 天前
@kneo 肯定用过啊,我喜欢 Linux 的那种自定义,我可以控制我电脑的每一个部分,我可以重新编译内核,可以设定任何一个系统参数,另外你说的为了方便说的是当服务器运行做开发环境?我问一句你真的用过吗?
|
47
kneo 237 天前 via Android
@noahlias 请问你控制了你自己电脑的哪个部分?编译了内核,于是,控制了啥?
你应该不是开发者,不明白如何转换生产力,以为装个 Linux 编译个东西就是学到东西了。那是二十年前学生时代的技术荒漠才有的想法。 现在是生产力时代,我告诉你开发者会做什么: 1. 如果你工作了,有大量的业务需求让你去开发。你也可以把前沿技术应用在业务上。 2. 如果你没工作,是个学生,有大量的开源项目可以让你参与进来。 3. 如果你不是专业的开发者,你也可以在 PC/安卓/NAS 上为自己开发应用程序。 开发者会把时间花在具有创造性的事情上。编译一个东西就是编译了一个别人的东西,没有开发者愿意在这上面浪费太多时间。 也许你是初学者,我不否认你一开始能靠自己编译学到点东西,但是你不会靠反复编译持续学到东西。 也许你就是闲的喜欢折腾编译。但是你说出的“用 Linux 不就是为了自己编译订制”就很无知。Linux 对开发者是生产力工具。也许对你是“浪费时间工具”。 |
48
noahlias 237 天前
@kneo 我没输出 Linux 为编译定制这个说法啊 你偷换概念 我说的是 Linux 高度自定义,所以有一些开源软件不愿意为这些做 CI pre compile 所以很多提供是源码编译这种方案,300 多种发行版你想想做适配有多么麻烦
你洋洋洒洒说了一大堆又扯到开发者生产力上了 哈哈哈 还说喜欢折腾编译笑死 我有半句说我喜欢折腾编译吗 另外不要给别人的话添油加醋 ‘’‘用 Linux 不就是为了自己编译订制’‘’ 这句话我没说过(你太能扯了 xd |