最近在用PyQt5写了一个聊天室,加上内网穿透实现了外网上面的聊天。想发给同学一起使用,但是使用Pyinstaller打包时遇到了好多坑。现记录一下。
PyQt5多项目使用Pyinstaller打包成exe遇到的坑
项目结构
我的项目大概结构如下所示:
其中除了server.py,基本都是客户端需要的东西,包括各种窗口,以及对应的emoji图片和文件等等。
开始打包
打包使用pyinstaller,先切换到目标文件夹,然后直接使用命令pyinstaller -F 需要打包的py文件主入口名称.py
,即可在目录下生成.spec文件,接下来我们要修改文件中的内容来完成打包。
对于spec文件中每一个参数应该怎么填写,我这里参考的是这篇文章:2个技巧,学会Pyinstaller打包的高级用法
我的spec文件如下所示:
#-*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['run_login.py','chat_window.py','En_De_MAC_By_File.py','File_Encrypt.py','login.py','RSA_hash.py','vachat.py','video_set.py'],
pathex=['C:\\Users\\86132\\Desktop\\qt_chat\\emoji','C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5','C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5\\Qt\\bin','C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5\\Qt\\plugins','C:\\Users\\86132\\Desktop\\qt_chat\\icon','C:\\Users\\86132\\Desktop\\qt_chat\\pic_grab','C:\\Users\\86132\\Desktop\\qt_chat\\client_cache'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
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='run_login',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon = 'logo.ico'
)
其中的pathex填写一些支持文件的路径,这里我使用的是绝对路径,问题不大。
还有一些动态库的路径,PyQt5打包完成之后总是提示一些奇奇怪怪的问题,接下来我将一一说道
PyQt5打包之后运行提示ImportError: DLL load failed
这个是PyQt5的一些老毛病了,你先看到对应报错的行,看看是哪个库出的问题。
这里我们可以直接将pyqt5的一些支持文件路径添加到pathx中(spec文件中的那个)
pathex=['C:\\Users\\86132\\Desktop\\qt_chat\\emoji','C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5',
'C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5\\Qt\\bin',
'C:\\Program Files\\Python37\\Lib\\site-packages\\PyQt5\\Qt\\plugins']
然后可能就是你用了anaconda,然后pyinstaller是安装在base环境中的,所以这个环境中没有对应的库,直接装上就可以解决问题了。
opencv的兼容性问题
打包里面包含opencv时,可能会出现兼容性问题导致exe文件不能够运行,这里可以选择对opencv进行降级,百度搜索一下即可。
资源文件不显示
我们的qt界面中有一些背景图片,但是打包好exe之后并没有显示。因为我们并没有将文件一同打包进exe中,所以我们只需要将对应的文件复制到exe路径中即可。如果是相对路径,也要保证相对路径不发生改变。当然,也可以使用data参数来进行打包。