1.用pyinstaller打包程序
安装pyinstaller包
pip install pyinstaller
使用pyinstaller打包命令
对入口程序使用打包
pyinstaller -F my.py #打包my.py,生成一个my.exe,会有一个控制台
pyinstaller -F -w my.py#-w,不显示控制台
pyinstaller -D my.py#F=onedile D=onedir;打包成一个文件夹
pyinstaller -F -w --onedir my.py#将资源打包成一个文件夹,dist下会有一个main文件,里面有exe文件及资源包
pyinstaller -F -W --onefile my.py#打包成一个文件,dist下只有一个exe文件,资源包包含在exe文件中
pyinstaller -F -i c:\my.icon my.py#打包时带图标,i后面接图标的位置
1.1 带控制台的打包方式,exe程序运行时会向控制台输出信息,如果有错误也会在控制台输出,可以先用带控制台的方式打包一下,看运行起来有没有错误,再用不带控制台的打包成最终版本。
1.2 打包好的exe文件在dist下
2.pyinstaller打包时权限不够
2.1 在控制台打包后出现错误:permission denied…
这是由于没有用root用户权限,可如此操作:
点击电脑左下角搜索栏,输入’cmd’,点击"以管理员身份运行",即可进入管理员权限的命令控制台,如何进入到my.py,要打包的程序的目录中,进行打包即可。
3.打包后错误:WARNING: file already exists but should not: C:\Users\workAI\AppData\Local\Temp_MEI132522\torch_C
3.1 这里是参考这位博主的:https://blog.csdn.net/weixin_43218120/article/details/108596405
首先找到打包后生成的my.spec文件,可以用pycharm打开整个主目录,再打开my.spec文件。
在a的结构体后面添加:
for d in a.datas:
if '_C.cp37-win_amd64.pyd' in d[0]:
a.datas.remove(d)
break
添加完之后再打包一次,不过这次是打包spec文件
pyinstaller -F my.spec
这样就可以让spec配置文件的修改生效了。
4.打包后错误:ModuleNotFoundError: No module named ‘skimage.filters.rank.core_cy_3d’ [18464] Failed to execute script main
4.1 又是模块找不到,这个和上面的不同,但依旧需要打开my.spec文件进行修改
具体错误如下:
Traceback (most recent call last):
File "main.py", line 5, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "interface\menu.py", line 23, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "interface\extract_skeleton.py", line 3, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "skimage\morphology\__init__.py", line 10, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "skimage\morphology\greyreconstruct.py", line 14, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "skimage\filters\__init__.py", line 19, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "skimage\filters\rank\__init__.py", line 1, in <module>
File "PyInstaller\loader\pyimod03_importers.py", line 531, in exec_module
File "skimage\filters\rank\generic.py", line 58, in <module>
File "skimage\filters\rank\generic_cy.pyx", line 1, in init skimage.filters.rank.generic_cy
ModuleNotFoundError: No module named 'skimage.filters.rank.core_cy_3d'
[18464] Failed to execute script main
这个需要在a的结构体的"hiddenimports=[ ]"中添加缺少的模块,作为隐性导入:添加后“ hiddenimports=[“skimage”,“skimage.filters.rank.core_cy_3d”],
”
4.2 修改spec文件后要再次打包
pyinstaller -F my.spec
5.打包后文件资源找不到
5.1 经历了以上错误之后,程序总算是运行起来了,但喵的,背景图不见了,图片文件的资源居然没有加载到。
因为打包后exe程序在dist文件下,而源码文件是和dist平级的,所以源码可以运行,而打包后资源文件不在dist文件夹之下,所以找不到。
这里可以理解为打包后my.exe就是my.py,但资源文件未被打包到dist下,导致绝对路径找不到。
问题原因找到了,这就好解决了,我直接将源码全拷贝到dist下,让my.exe和资源文件的路径关系变成my.py和资源文件的路径关系一样即可。
5.2 整了这么久,总算是完美运行了!
如果文章有所错误,请留言评论区,以便改进。
6.最后时刻牢记:
- 学了就忘等于没学
- 越努力越自信,越懒惰越自卑