使用pyinstaller配合nuitka打包,发布python程序

引言

软件版本:pyinstaller6.3.0,nuitka2.0.3,win7及win11均已测试通过。使用本文打包方法打包完成后使用pyinstxtractor.py解包,源码均已加密。

众所周知,python程序目前有两种常用的打包方式,pyinstaller及nuitka,根据我的经验总结,各自的优缺点如下:

pyinstaller:打包速度很快,成功率很高,但是运行速度比nuitka打包的程序慢不少,代码容易被破解

nuitka:打包速度慢,成功率也比较低,但是运行速度较快。

本文推荐的方式是使用nuitka编译自己的代码,将py文件编译为pyd文件,这里解释一下,.pyd 文件通过预编译和使用底层编程语言的优势,极大地减少了运行时的开销,从而使得python执行速度得到提升。编译完成后,再使用pyinstaller打包程序。下面详细叙述实现思路。

准备工作

开始前的准备工作,环境需要安装好pyinstaller,nuitka。

假设项目文件结构如下:

|-- main.py
|-- app 放置自己代码的文件夹

操作步骤

第一步

针对app文件夹中所有的py文件,使用nuitka的 --module命令将py文件转为pyd文件,这一步会同时生成pyi文件,该文件包含了import信息。

nuitka命令如下:

首先请使用cd命令切换至项目目录,然后使用以下命令。

!如果电脑中有多个python解释器,命令中的python可以改为绝对路径的python.exe,如D:\python\400WP\.venv\Scripts\python.exe

python -m nuitka --module app --include-package=app

该命令会生成以下两个文件:

①app.cp311-win_amd64.pyd文件,cp后面的数字是你的python版本。该文件类似于dll文件,包含了你的程序代码,但是不包含你的资源文件,如json,html,png等等的文件,需要你另行处理。

②app.pyi文件,该文件是文本文件,包含了关联的pyd文件所有的import信息,对于后面的打包非常重要,关系到pyinstaller能不能正确识别到所有需要被打包的第三方库。

第二步

针对第一步生成的pyd文件,将新生成的pyd模块导入信息添加至main.py文件,具体如下:

1,新增import导入信息,将上一步生成的pyi文件,以记事本方式打开,复制其中的import信息至main.py文件中。

2,新增import导入信息,加一行,import app

这样做是为了保证pyinstaller能识别到所有需要导入的文件及模块。

tips:如果觉得这样复制之后import信息显得很乱,不美观,可以使用isort工具规范import语句,①pip install isort;②命令行执行 isort main.py,即可自动排序去重import语句。

第三步

使用pyinstaller打包main.py文件。

第四步

得到最终打包,该过程只有main.py文件没有加密,其余代码均被转为二进制文件,加密的同时,运行速度也得到了提升。main.py文件,内容尽量简单。比如像下面这样,别人破解了也没啥用。

if __name__ == '__main__':
    QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)

    app = QtWidgets.QApplication(sys.argv)
    window = MasterWindow()
    window.show()
    app.exec()
    sys.exit()

第五步

这一步是程序打包体积优化,若没有这个需求可以不看。

使用本人开发的脚本对打包后的程序体积进行优化, 大概能优化30%~50%。

脚本获取如下,请仔细阅读说明后使用。

打包瘦身脚本

视频讲解

pyinstaller配合nuitka打包,发布python程序_哔哩哔哩_bilibili

总结

本打包姿势,得到的打包程序,拥有nuitka打包程序的高性能优点,也拥有pyinstaller打包速度快成功率高的优点。

缺点是继承了pyinstaller打包后程序启动速度慢的缺点,若更进一步优化,请看下篇文章

嵌入式打包,打包新姿势

交流群

要是打包遇到什么问题,可以加群交流。

新群友进群后,按下面格式做自我介绍

比如:

版面:Python与模具(您的知乎号,B站,或者公众号,可以为无,方便交流)

行业:营销,模具,广告

模块:Sanic,PyQt,爬虫,后端,全栈

你可能感兴趣的:(python)