千万别用 pyinstaller 打包

折腾了两天了,实在没辙了,来看看有无佬友给点思路?

事情是这样的,我撸了一个 py 项目,AI 自动生成视频,用到了 numpy、manim 等等一堆依赖(100+)

开始是部署到服务端(Docker)但是我的小机太拉了,最多同时跑两个进程就炸机,然后就想到做成客户端,说干就干。

到打包阶段了,试了 pyinstaller,很成功,问题:

  • 启动巨慢,看 issues 用 onedir 模式,还是慢,不过可以加 splash 给用户提示,也能接受
  • 但是!splash 不支持 MacOS,在我的老mac上要启动 40s+,然后没有任何提示,就只能死等(noconsole)

怎么办呢,换方案,nuitka 很多人吹,编译到c,速度飞起,赶紧一试,挖草,我那100+依赖,打了半个小时(32G + i713700)都没打完,这还咋调试,实在没耐心了用下去。

不考虑保护源码,要支持跨平台,还有啥思路呢,下面是我想到的?

  • flet: 打包成 dart flutter,但是…
  • zipapp:py 内置的一种 类似 jar ?,但是还得要客户安py呀
  • inno setup:结合 zipapp 或 nuitka ,只打源码,在安装阶段下载 python embed 然后 pip 安装依赖,但是 macos 好像没类似的操作?

下面更新下我的折腾记录,希望有同样需求/困惑的有个参考

我是js佬,刚学py极其不专业,有表述错误的地方请谅解!


71 Likes

这个不应该以服务方式提供吗?直接脚本一键部署啊。

1 Like

试试这个

4 Likes

这就是绿色版py?,没提供打包方案,只提供了跨平台的 python 呀

2 Likes

这么多包,有其他打包的能打包出来很小吗?是在虚拟环境下建的项目打包的吗?

没理解俺的需求,不是每个客户都会脚本xxx…

2 Likes

不要求小,只要求不要太慢,或者启动有提示!

现在innosetup压缩完 不到200m,解压后不到600m

3 Likes

学up主们,打两个整合包,win和mac分开

1 Like

感谢佬友,不过没审题,可以再看看主题 :pleading_face:

再写个新程序,专门用来显示提示,与原项目完全无关,仅仅显示提示
检查到启动成功就关闭这个程序?

1 Like

PyInstaller 真的是字面意义上的打包,相当于在 Python 的基础上有一层包装,必然会对性能有一定的影响,而且很容易逆向。

Nuitka 是我在用的目前最理想的方案,编译到 C,速度拉满,当然这种级别的编译自然相当耗费时间。不过通过恰当的配置,可以使 Nuitka 缓存已编译的依赖,后续再次编译时可以减少编译时间。

3 Likes

你猜为啥 macos 下的 pyinstaller 不支持 splash …

1 Like

用GO重写.

2 Likes

踩过些坑了, 有装 ccache

我也尝试过把依赖注释掉,先打一部分缓存出来,但是还是太慢了…

1 Like

python 跨平台也可以 docker 啊。跟你服务器配置有什么关系啊。如果你要纯粹的客户端,兼容性没有那么好。而转 C 又没耐心。只有提供不同平台的一键安装脚本了。

1 Like

其他语言没有 manim 这种框架,我的核心依赖,不然我肯定用俺的 js 一把梭

3 Likes

我可以 docker,用户哪知道这些…

不是一个AI项目要给客户用么,用的话解压即用和打包成可执行程序没差吧,当然要做成商业可执行程序的话另说,看客户需要的提供形式了。佬说的脚本安装也是方式,当然如果解压即用能接受的话。。。

2 Likes

是借鉴的这个项目嘛

3 Likes

新建虚拟环境,只保留有必要的库,减少打包压力,不过有manim这类库估计也少不了多少依赖 :tieba_087:

3 Likes