项目场景:
Python版本:3.8
因公司业务需求,须开发一套局域网内视频会议软件,此次采用Python实现此功能。
程序编写完并在编译器实现此功能后,采用pyinstaller组件打包成应用程序
问题描述:
在使用pyinstaller组件打包过程中,着实遇到一些问题,以下列出此次遇到主要的问题:
1.如何打包多个文件?
2.打包完运行后控制台显示”找不到指定模块。mkl_intel_thread.l.dll”,图示如下:
3.打包如何排除不需要的组件以减少包的大小?
4.待补充 (?◠◡◠?)✌
原因分析:
本次打包组件均由conda install安装,在编译器中opencv引用模块运行项目是没问题的,只是打包运行就会报Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.l.dll,缺少MKL文件 ,疑惑了一段时间…( @_@; )
解决方案:
首先呢,当然是找百度大神来解决问题啦 (๑•̀ㅂ•́)و✧,寻寻觅觅,无果,但至少让我理解了一点打包的过程和注意事项,结合过去代码经验,这次把Anaconda的opencv、numpy和mkl模块都给卸了,代码如下:
conda uninstall opencv conda uninstall numpy conda uninstall mkl
然后改成如下:
pip install mkl pip install numpy pip install opencv
以上最好按顺序安装,三个组件有相互依赖关系,安装完发现部署后不再报错。
在安装过程中也发现了两个安装方式安装的组件其实不太相同,从包的大小得知,pip install安装的包应该是比较完整的,所以pyinstaller打包起来不会导致文件丢失。
这里就解决了问题2啦(把最难的先给解决啦~ (  ̄? ̄)人(^?^ ))
接下来说明一下如何打包多文件。
首先要打包多文件,先生成一个spec文件,代码如下:
pyi-makespec app.py
这行代码会生成一个app.spec文件在当前目录下。
生成的app.spec的内容如
本文来源gao!%daima.com搞$代*!码$网3
下:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None #如果要添加打包文件,在这里添加 a = Analysis(['app.py'], #例:['app.py','app1.py','app2.py'] pathex=['C:\\yourAppDir'], #打包路径,一般默认为当前文件夹路径 binaries=[], # 打包静态资源,这边为元祖类型 datas=[], # 例:[('C\\yourAppDir\\images','images'),('C\\yourAppDir\\videos','videos')] hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], #生成的执行文件名 name='MyAwesomeApp', #生成 MyAwesomeApp.exe debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, #运行时是否显示控制台,注意True和False的首字母都要大写 console=True)
以下为打包常用命令:
常用: -i 给应用程序添加图标 -F 指定打包后只生成一个exe格式的文件 -D ?onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项) -c ?console, ?nowindowed 使用控制台,无界面(默认) -w ?windowed, ?noconsole 使用窗口,无控制台 -p 添加搜索路径