引言
软件版本: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,爬虫,后端,全栈