当前位置: 首页 > 工具软件 > py2exe > 使用案例 >

将python项目打包成exe(Pyinstaller 和 Nuitka)

韶浩皛
2023-12-01

目录

一、打包方法

方法一:使用pyinstaller进行打包

方法二:程序中导入了matlab.engine的打包方法

方法三:使用Nuitka进行打包

二、打包过程中遇到的问题及解决方法

1、pyinstaller打包后运行提示找不到模块

2、Pyinstaller打包出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position解决方案

3、pyinstaller打包报错: RecursionError: maximum recursion depth exceeded,UnicodeDecodeError 解决办法

4、pyinstaller打包exe文件及过程中 no module named 问题处理


一、打包方法

方法一:使用pyinstaller进行打包

第一步,安装pyinstaller

pip install pyinstaller

(如果安装失败,用管理员权限安装)

第二步,在要打包的文件夹路径下打开cmd,输入命令进行打包:

pyinstaller -F -w demo.py
-F表示指定打包后只生成一个exe格式的文件,-w表示窗口,无控制台。

还可以更换exe的图标,以及tk窗口默认的小羽毛图标,这里不展开讲。

第三步,把运行程序需要的数据放进生成的dist文件夹下,再打开exe运行。

 

参考:

https://www.cnblogs.com/navysummer/p/10614905.html

https://blog.csdn.net/weifuliu/article/details/82826643

 

方法二:程序中导入了matlab.engine的打包方法

当打包的程序中导入了matlab.engine,根据方法一会报matlab没有mlarray模块的错误,需要用第二种方法进行打包。

第一步,新建一个hooks的空白文件夹,在hooks中新建hook-matlab.pyhook-matlab.py中写入以下信息:

from PyInstaller.utils.hooks import collect_all
datas, binaries, hiddenimports = collect_all('matlab')

然后,把hooks文件夹放到路径"C:\Users\用户名称\Anaconda3\Lib\site-packages\predict\hooks"下。(用户名称修改为自己电脑上的用户名称)

第二步,在需要打包的文件夹路径下打开终端,输入以下命令(用户名称修改为自己电脑上的用户名称):

pyinstaller lncLocPredTool5.py --additional-hooks-dir "C:\Users\用户名称\Anaconda3\Lib\site-packages\predict\hooks" --hidden-import sklearn.neighbors.typedefs

第三步,把程序运行需要用的数据放到dist文件夹下,就能点开dist文件夹下的exe文件运行程序啦。

 

参考:

https://stackoverflow.com/questions/61482776/creating-exe-file-with-pyinstaller-and-matlab-engine

 

方法三:使用Nuitka进行打包

第一步,下载MinGW64 8.1https://link.zhihu.com/?target=https%3A//sourceforge.net/projects/mingw-w64/files/),解压到C盘目录下,在文件夹路径下打开cmd,输入gcc.exe –version,检查是否有版本显示,有则说明有效。

然后,把安装路径“C:\mingw64\bin”添加进环境变量。

第二步,安装Nuitka

pip install nuitka

或者安装最新版本(根据使用经验发现新版本修复问题多,兼容性更好)

pip install -U "https://github.com/Nuitka/Nuitka/archive/develop.zip"

第三步,编译文件

1)常用命令

--mingw64 #默认为已经安装的vs2017去编译,否则就按指定的比如mingw

--standalone 独立文件,这是必须的

--windows-disable-console 没有CMD控制窗口

--recurse-all 所有的资源文件 这个也选上

-recurse-not-to=numpy,jinja2 不编译的模块,防止速度会更慢

--output-dir=out 生成exeout文件夹下面去

--show-progress 显示编译的进度,很直观

--show-memory 显示内存的占用

--plugin-enable=pylint-warnings 报警信息

--plugin-enable=qt-plugins 需要加载的PyQt插件

--windows-icon=你的.ico 软件的图标

2)如下是一条完整的命令 编译的py文件为index.py

nuitka --mingw64 --windows-disable-console --standalone --show-progress --show-memory --plugin-enable=qt-plugins --plugin-enable=pylint-warnings --recurse-all --recurse-not-to=numpy,jinja2 --output-dir=out index.py

 

参考:https://zhuanlan.zhihu.com/p/133303836

 

二、打包过程中遇到的问题及解决方法

1pyinstaller打包后运行提示找不到模块

在打包时候,并没有提示错误,可以顺利打包成exe文件。但是在运行打包好的软件时,会提示找不到模块,本人遇到的是找不到第三方模块,例如 requests 。这时候需要在打包时指定 -p 参数,后面跟上python目录下的第三方库模板目录路径 site-packages。再打包就成功了

pyinstaller example.py -F -p C:/python/lib/site-packages

参考:

https://blog.csdn.net/itworld123/article/details/93051789

 

2Pyinstaller打包出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position解决方案

在你打包的命令行中先输入chcp 65001 ,然后再输入打包命令。

pyinstaller -F xxx.py

参考:https://blog.csdn.net/qq_38343111/article/details/91362920

 

3pyinstaller打包报错: RecursionError: maximum recursion depth exceededUnicodeDecodeError 解决办法

出现原因:

    这个错误意思是超过最大递归深度,python默认的递归深度默认是1000),因此当递归深度超过就会引发这样的异常。

解决方法:

 1)执行pyinstaller -F XXX.py 它会在你的目录文件生成XXX.spec文件,然后报错,出现该类异常。

 2)打开XXX.spec文件,在开头添加上面两行代码。

  import sys

  sys.setrecursionlimit(1000000)

3)继续执行打包,但是还文件名:pyinstaller -F XXX.spec ,执行该文件。

参考:https://www.cnblogs.com/patrickstar2019/p/11465220.html

 

4pyinstaller打包exe文件及过程中 no module named 问题处理

若打包后,运行exe报错:

ModuleNotFoundErrorNo module named ‘matplotlib.backends.backend_tkagg’

也就是没找到matplotlib.backends.backend_tkagg模块,解决方法是在打包命令后面加上如下:

demo.py是要打包的文件

pyinstaller -F demo.py --hidden-import matplotlib.backends.backend_tkagg

其它缺失模块也同理,把上述‘matplotlib.backends.backend_tkagg’替换成缺少的模块的名称即可。

参考:https://blog.csdn.net/huxiangen/article/details/79795768

 

 类似资料: