最近 Python 环境管理从 conda 切换到了uv,找到之前用 cargo 的感觉了,真爽。
我发现 uv 可以下载独立的 Python ,非常感兴趣,因为之前经常使用 Embedded Python 打包东西。Embedded Python 只支持 Windows ,而 uv 支持 Windows/Linux/MacOS 。
同时我又遇见了一个很 amazing 的项目,叫cosmopolitan,它可以将 C/C++编译为一种叫APE的格式的文件,这种神奇的格式同时满足多种文件格式,因此它可以在大多数主流的平台上运行。
受以上两个项目启发,pyfuze 诞生了。它可以将你的 Python 项目打包,使其可以在大多数主流平台上运行。pyfuze 跨平台的逻辑是这样的:
项目缺点是需要网络下载东西,不过你可以运行一下再打包,但这样就固定在你运行的平台了。
截至目前,pyfuze 项目已获得 25 颗星,是我获得 star 最多的一个项目。如果你也喜欢这个项目,不妨也点颗⭐:)
P.S. uv 、python 、依赖都是从国外网络环境下载的,如需在国内网络环境下运行,需使用--env 、--uv-install-script-windows 以及--uv-install-script-unix 这三个选项,后两个选项支持使用文件路径。
![]() |
1
LeeReamond 13 天前
虚拟环境最大一个问题是,比如我经常用 sublime text 这种基于系统默认环境的编辑器,启用虚拟环境解释器是很麻烦的事。uv 解决这个问题了吗?
|
![]() |
2
smallparking 13 天前 via Android
你这个其实也不是打包, 是下载 pytnon + 依赖库
然后以源码形式运行 python |
3
Tanix2 OP @LeeReamond sublime text 我不太了解,我经常用 vscode/cursor ,uv 会创建.venv 文件夹,使用.venv/Scripts/python.exe 作为解释器就好了。
|
4
Tanix2 OP @smallparking 可以直接执行,应该算打包的
|
![]() |
5
LeeReamond 13 天前
@Tanix2 所以就是执行这个指定目录的解释器,它的所有依赖就会指向对应的解释器环境是吧?那默认系统命令中的 python 怎么理解呢,是需要像 conda 一样激活环境才能使用 python 命令吗,还是 uv 不安装全局可运行的 python
|
![]() |
6
SenLief 13 天前 via iPhone
这是不是要每个包都下载一次 python
|
![]() |
7
passive 13 天前 via Android ![]() “打包”的目的通常有:
1. 不会操作计算机的小白客户开箱即用(楼主的方案遇到问题的风险有点大) 2. 给内网机器用(这方案也不行) 不过从 conda 换到 uv ,体验确实好了很多。 |
8
cenyejinxi 13 天前
@Tanix2 #5 你这个可以直接执行是执行的 pyfuze 阿 那为什么不直接下载对应平台的 python
|
9
HTravel 13 天前
你这用起来这么麻烦,算什么打包。真打包必须支持所有依赖项全部打包进去。要做到好用基本上就要用 C++写起动器。像 Java jar 包启动时必须选择对应版本的 java 运行时,我就特意给 Java 写了引导器。不过我是分平台写的,windows 平台用汇编写的,macOS 用的 swift 。当然,实际上我的引导器功能不可能这么单一,还包括单例模式、以及设置进程最大运行时间,超时就杀掉。虽然最初是为 java 写的,但后来发现其实启动解释型代码的原理一样,也可以用于其他各种解释型语言(原生代码本就能自己启动也不需要解释器,当然如果为老的软件让其支持单例、最大运行时间包裹个引导器也没问题)。当然,我的方案不足之处是无法跨平台。除非再用 Qt 再外层再包裹一层,根据操作系统选择不同的引导器。
你的还不如改 docker 算了,然后宣称完美跨了所有平台 |
10
Alias4ck 13 天前
你这个不是要你的项目支持跨平台吗 只是一个 wrapper 啊 我要是写的 python c extension 咋办
|
11
ronen 13 天前 via Android
我從公司刻了磁盤去甲方做實驗,到了地兒一看大內網。完蛋
|
![]() |
12
sikong31 12 天前
@smallparking 不都是这样吗,打包成 exe 的依然是解压到临时目录运行
|
![]() |
13
smallparking 12 天前 via Android
@sikong31 我本意是 这个 pyfuze 打出的东西会在运行的时候下载一堆依赖。
|
![]() |
14
swordfeng 11 天前
你这跟 pyinstaller 之类的打好然后做个下载器下载对应系统版本的运行有啥区别😂
|
![]() |
15
toan 11 天前
挺好,star 了
|
![]() |
16
iorilu 11 天前
uv 没代理装不了 python 得
国内小白用不了 打包就是为了给小白用的 |
![]() |
17
zwzwzwzwzxt 11 天前
cosmopolitan 编译出来的可执行文件内嵌了个 zip, 程序里可以通过 `/zip/` 虚拟路径访问。所以理论上应该可以编译一个 cosmo 版本的 python 解释器,然后把所有依赖内嵌到 `/zip/` 下。
其实官方给的 python demo 就是这么干的。不过考虑到第三方依赖的复杂性,可能要区分哪些是 pure python 库,哪些是带平台相关的依赖的 |
![]() |
18
zwzwzwzwzxt 11 天前
另外看到 OP 提到了 cargo, 不知道有没有尝试过用 Rust 开发 APE 项目?我最近在研究这个,发现除 Linux 外其他平台下的异步总有问题,哪怕用支持 poll 的 smol 也不行 = =
|
![]() |
19
cat9life 11 天前
统一上面提到的。打包的目的是什么?越改越复杂了,我还不如直接装一台运行环境?甚至 docker ?
|
20
tairan2006 11 天前
windows 环境用 pyinstaller ,其他环境用 docker 就行…
好用还是 go build 这种 |
21
Tanix2 OP @iorilu 目前的话国内 uv 的镜像有一些,但是不全。我写了个项目来建立 uv installer 、uv binary 、uv python 的镜像: https://github.com/TanixLu/uv_aliyun_mirror
我部署了一个,使用方式:--uv-install-script-windows https://uv-mirror-fc-uv-mirr-service-qirrgrgrbr.cn-hangzhou.fcapp.run/uv-installer.ps1 --uv-install-script-unix https://uv-mirror-fc-uv-mirr-service-qirrgrgrbr.cn-hangzhou.fcapp.run/uv-installer.sh --env INSTALLER_DOWNLOAD_URL=https://uv-mirror-fc-uv-mirr-service-qirrgrgrbr.cn-hangzhou.fcapp.run --env UV_PYTHON_INSTALL_MIRROR=https://uv-mirror-fc-uv-mirr-service-qirrgrgrbr.cn-hangzhou.fcapp.run --env UV_DEFAULT_INDEX=https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ (最后一个选项是使用 pypi 清华源镜像) |
23
Tanix2 OP 每个工具有它的优点和局限性,我这个工具的优点是跨平台,只用打包一次
|
24
Tanix2 OP @zwzwzwzwzxt 我之前看到过相关的一篇文章,好像是不太好弄,rust 编译器有的东西是写死在里面的: https://ahgamut.github.io/2022/07/27/ape-rust-example/
|
25
Tanix2 OP @tairan2006 那别人得有 docker 啊,要是用户没有 docker 怎么办?我这个的依赖可以说就一个网络。
|
![]() |
26
zwzwzwzwzxt 10 天前
@Tanix2 #24 哈哈这个项目我有看,不知道是太老了还是 demo 太简单了,我遇到了一个大坑就是 LLVM 编译默认会插入栈保护代码,在 aarch64 下还会占用 `x28` 寄存器,导致莫名崩溃。好在这俩可以通过添加编译参数解决,目前没出现莫名崩溃的问题了。
再一个坑就是标准库,某些操作直接走 syscall 没走 libc ,还有一些 flag 等参数值在其他平台上不兼容,必须得 patch 标准库。。 |
27
BBBOND 10 天前
还得是 pyinstaller
|
28
Tanix2 OP @zwzwzwzwzxt 确实没研究过这方面,不了解了
|
![]() |
29
frostming 9 天前
|
![]() |
30
tomczhen 8 天前
都要联网了,直接打包成 whl 然后 uvx 来运行应该更直接。
|