使用nuitka打包python代码为exe可执行程序

本文详述了使用Nuitka将Python项目打包成exe的全过程,包括环境配置、Nuitka安装、打包步骤及遇到的坑。在打包PyQT5项目时,作者强调了独立环境、命令参数选择和依赖处理的重要性,并分享了解决DLL加载失败问题的经验。
该文章已生成可运行项目,


前言

在项目中,我负责开发一个用于图像处理的可视化图形界面。人生苦短,我用python。python首选的GUI框架当然是pyqt5啦!项目很快就完成了,现在需要将我写的程序打包成exe文件分发给客户。python写代码一时爽,打包交付却没有C++版的QT方便。现有的python打包方式主要是使用pyinstaller,但是在调研过程中,发现pyinstaller打包的程序一般都非常大,而且运行的速度很慢。然后我就注意到了一个较新的工具nuitka,据说打包速度快,打包完的程序也不大,刚好符合我现有的需求——这时我还没意识到我面临的问题。由于这是一个较新的工具,在打包过程中我遇到了很多坑,而且可参考的解决方法并不多,然后我就开始了自己的填坑之路……也学到了教训——新技术不要轻易尝试,除非你有解决问题的能力。


一、nuitka是什么?

网上关于nuitka介绍一开始是看下面几个帖子:
Python打包exe(32/64位)-Nuitka再下一城
Nuitka之乾坤大挪移-让天下的Python都可以打包
nuitka使用参考
看了几遍总觉得稀里糊涂,一篇文章能说清楚的内容分成了好几篇文章,还相互引用,好像什么也没说清楚,只是告诉你怎么做,我按照同样的方法总会出现各种各样的问题。最后想明白了,只有理解了内容才能因地制宜地解决问题,最好的使用一个工具的教程往往是官方文档,其次才是别人总结的博客。

nuitka是一个用来将python代码打包为exe可执行文件,方便其在没有相关环境的windows系统上运行的工具(貌似也支持打包成linux系统下的可执行程序,没需求暂未尝试)。其原理为:将部分python代码(自己写的部分)转换成C代码,以提高运行的速度;import的第三方包不进行编译,在运行时,通过一个python3x.dll的动态链接库执行第三方包的python代码,通过这样的方式减少exe包的大小。

二、nuitka打包流程

我的python环境

conda 4.7.12
Python 3.6.13
numpy 1.16.4
pyqt5 5.15.4

1.下载C编译器

nuitka的原理就是将部分代码转换为C,然后进行编译,所以需要先下载C编译器。
(1)下载MinGW64 8.1,目前为止还是这个版本最稳定。下载地址:https://sourceforge.net/projects/mingw-w64/files
百度网盘下载 密码:8888
在这里插入图片描述
(2)将文件3 MinGW64 8.1 解压到C盘,并添加环境变量
在这里插入图片描述
在这里插入图片描述
(3)打开cmd命令,使用gcc.exe --version测试是否添加上。一个坑:之前如果安装过c编译器可能添加过gcc环境变量导致MinGW64 8.1的环境变量被覆盖,早期的gcc版本在编译代码中可能会出现bug。
在这里插入图片描述
(4)其他两个文件在安装Nuitka时会用上

2.下载Nuitka

(1)pip install nuitka 或者 conda install nuitka
python环境下载工具应该是很基本的内容,速度慢可以添加镜像源,这一部分不再赘述

3.使用nuitka简单打包python代码

(1)新建一个简单的python文件,测试运行没有出错
(2)使用nuitka xxx.py命令进行打包。在打包过程中会有提示下载一个包到***\nuitka\***这样一个文件夹中,下载进度条可能不动或者很慢,就可以使用 ctrl + C终止进程,手动将百度云下载的文件1解压到提示的这个文件家中
(3)重新使用nuitka xxx.py命令进行打包。还会提示下载另一个包,同样的方式将文件2解压放入
(4)重新使用nuitka xxx.py命令进行打包,这次应该就没问题了

4.使用nuitka打包pyqt5项目

先介绍以下nuitka的打包命令:

–mingw64 默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
–standalone 独立环境,这是必须的

本文章已经生成可运行项目
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值