Python打包成 exe,太大了该怎么解决?

liftword3个月前 (03-03)技术文章15

有个刚毕业的小学妹问,Python打包成exe,太大了该怎么解决?

首先要知道Python打包exe为什么这么大?

我猜你一定是用PyInstaller打包exe的,PyInstaller特点是将乱七八糟的东西打包一起,比如各种依赖库,即使你的程序只使用了pandas很小一个功能,比如read_data,它也会将整个pandas打包,这就导致出来的exe文件非常的大。

还有PyInstaller会打包Python解释器,方便在没有python的机器上运行python,而Python解释器本身就很大,包含了很多标准库,有二三十兆。这其实是不必要的负担,对于一个exe文件来说。

那如何解决这个问题呢?有两种方案。

第一种,优化PyInstaller打包过程,既然它把什么乱七八糟的都放进去了,我们来做个断舍离,使用.spec文件自定义打包配置。

.spec文件是PyInstaller在打包exe程序时生成的配置文件,包含了所有配置信息,像脚本路径、依赖库、资源文件、打包选项等,可以通过修改.spec文件,来精简不必要的依赖。

首先将待打包的py文件放进.spec文件里

pyi-makespec your_script.py

然后编辑.spec文件,剔出不必要的依赖库。

Bash
# your_script.spec
a = Analysis(
    ['your_script.py'],
    pathex=['/path/to/your/script'],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=['unnecessary_library'],  # 排除不必要的库
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
)

最后再用PyInstaller打包.spec文件,变成exe。

pyinstaller your_script.spec

但这种方法打包出来的exe还是会偏大,虽然剔除了不必要的依赖库,但是python解释器和用到的库还是会被打包进来,这就是比较烦。

接下来是第二种方法,使用Nuitka来打包exe文件,Nuitka会Python代码编译为C代码,生成更小的二进制文件,这样就没有各种依赖库和Python解释器一起打包的困扰了。

Nuitka用起来很简单。

Bash
pip install nuitka
nuitka --standalone --onefile your_script.py

接下来是案例,我用AI写了一个简单的Python应用-胎儿体重计算器,通过几个产检参数计算胎儿的体重,UI实现出来大概如下这样。

这个程序使用Python tkinter实现的,这是Python的标准库。使用PyInstaller打包出来的exe文件大小10.3MB。

接下来使用Nuitka打包出来的exe文件大小7.65MB,比PyInstaller小了35%,算是不错了,因为这个程序并没有用到第三方库。

如果是打包更加复杂的程序,软件的大小会进一步压缩,Nuitka的优势会更明显。

相关文章

20 天学 Python 文件操作:Day 8 压缩与解压文件

在日常开发中,压缩和解压文件是处理文件操作的常见需求。Python 提供了丰富的内置模块,比如 zipfile 和 shutil,让我们能够高效地压缩和解压文件。今天我们将学习如何使用这些模块进行操作...

Python全能压缩:ZIP的压缩、解压、文件筛选与删除,一键搞定!

引言:这个方法实现了文件压缩与解压的常见操作,涵盖内容如下:1、从文件夹创建 ZIP 文件 2、从文件夹创建 ZIP 文件(筛选特定文件) 3、解压 ZIP 文件中的所有内容 4、解压 ZIP...

python散装笔记——131: 解压文件

为了提取或解压缩tarball(tar归档文件)、ZIP文件或gzip文件,Python分别提供了tarfile、zipfile和gzip模块。Python的tarfile模块提供了TarFile.e...

python压缩/解压gzip 大文件

最近处理线上日志,日志文件刚好是经过压缩的,且是gz后缀。自己便采用gzip库来处理。示例如下:创建gzip文件# -- coding: utf-8 -- import gzip """ 创建gzi...

小明用Python暴力破解压缩文件zip密码,省了250块钱

那天晚上小明和你一样在某个小网站上搜寻某些私密的学习资料突然看到论坛有人提供了一个非常牛逼的资源小明怀着激动的心情下载了下来他怀着激动的心情打开了这个压缩文件看到就只有这么一个 txt 小明就是一顿双...

Python 实现图片大小压缩

起因截图组件配合验证码使用优化建议既然没人帮忙解决只能自己动手了小白先直接献上代码from PIL import Imageimport osdef compress_image(infile, ou...