[真·跨平台] Python 打包新思路

115 天前
 Tanix2

最近 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 这三个选项,后两个选项支持使用文件路径。

5075 次点击
所在节点    Python
31 条回复
LeeReamond
115 天前
虚拟环境最大一个问题是,比如我经常用 sublime text 这种基于系统默认环境的编辑器,启用虚拟环境解释器是很麻烦的事。uv 解决这个问题了吗?
smallparking
115 天前
你这个其实也不是打包, 是下载 pytnon + 依赖库
然后以源码形式运行 python
Tanix2
115 天前
@LeeReamond sublime text 我不太了解,我经常用 vscode/cursor ,uv 会创建.venv 文件夹,使用.venv/Scripts/python.exe 作为解释器就好了。
Tanix2
115 天前
@smallparking 可以直接执行,应该算打包的
LeeReamond
115 天前
@Tanix2 所以就是执行这个指定目录的解释器,它的所有依赖就会指向对应的解释器环境是吧?那默认系统命令中的 python 怎么理解呢,是需要像 conda 一样激活环境才能使用 python 命令吗,还是 uv 不安装全局可运行的 python
SenLief
115 天前
这是不是要每个包都下载一次 python
passive
115 天前
“打包”的目的通常有:
1. 不会操作计算机的小白客户开箱即用(楼主的方案遇到问题的风险有点大)
2. 给内网机器用(这方案也不行)

不过从 conda 换到 uv ,体验确实好了很多。
cenyejinxi
115 天前
@Tanix2 #5 你这个可以直接执行是执行的 pyfuze 阿 那为什么不直接下载对应平台的 python
HTravel
115 天前
你这用起来这么麻烦,算什么打包。真打包必须支持所有依赖项全部打包进去。要做到好用基本上就要用 C++写起动器。像 Java jar 包启动时必须选择对应版本的 java 运行时,我就特意给 Java 写了引导器。不过我是分平台写的,windows 平台用汇编写的,macOS 用的 swift 。当然,实际上我的引导器功能不可能这么单一,还包括单例模式、以及设置进程最大运行时间,超时就杀掉。虽然最初是为 java 写的,但后来发现其实启动解释型代码的原理一样,也可以用于其他各种解释型语言(原生代码本就能自己启动也不需要解释器,当然如果为老的软件让其支持单例、最大运行时间包裹个引导器也没问题)。当然,我的方案不足之处是无法跨平台。除非再用 Qt 再外层再包裹一层,根据操作系统选择不同的引导器。

你的还不如改 docker 算了,然后宣称完美跨了所有平台
Alias4ck
115 天前
你这个不是要你的项目支持跨平台吗 只是一个 wrapper 啊 我要是写的 python c extension 咋办
ronen
115 天前
我從公司刻了磁盤去甲方做實驗,到了地兒一看大內網。完蛋
sikong31
114 天前
@smallparking 不都是这样吗,打包成 exe 的依然是解压到临时目录运行
smallparking
114 天前
@sikong31 我本意是 这个 pyfuze 打出的东西会在运行的时候下载一堆依赖。
swordfeng
113 天前
你这跟 pyinstaller 之类的打好然后做个下载器下载对应系统版本的运行有啥区别😂
toan
113 天前
挺好,star 了
iorilu
113 天前
uv 没代理装不了 python 得
国内小白用不了

打包就是为了给小白用的
zwzwzwzwzxt
113 天前
cosmopolitan 编译出来的可执行文件内嵌了个 zip, 程序里可以通过 `/zip/` 虚拟路径访问。所以理论上应该可以编译一个 cosmo 版本的 python 解释器,然后把所有依赖内嵌到 `/zip/` 下。

其实官方给的 python demo 就是这么干的。不过考虑到第三方依赖的复杂性,可能要区分哪些是 pure python 库,哪些是带平台相关的依赖的
zwzwzwzwzxt
113 天前
另外看到 OP 提到了 cargo, 不知道有没有尝试过用 Rust 开发 APE 项目?我最近在研究这个,发现除 Linux 外其他平台下的异步总有问题,哪怕用支持 poll 的 smol 也不行 = =
cat9life
113 天前
统一上面提到的。打包的目的是什么?越改越复杂了,我还不如直接装一台运行环境?甚至 docker ?
tairan2006
113 天前
windows 环境用 pyinstaller ,其他环境用 docker 就行…

好用还是 go build 这种

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1133945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX