在网上找pyinstaller资料时,发现大家提供的方法仅对简单的程序有效,而略复杂的程序各种报错,在这篇推文中我会阐述具有鲁棒性的pyinstaller打包方法。官网:http://www.pyinstaller.org/
参数 | 解释 |
---|---|
-F, --onefile | 生成单个exe文件 |
-D, --onedir(默认) | 生成一个exe文件与依赖库分开的目录 |
–clean | 清空上一次编译产生的所有文件 |
–specpath | 生成spec文件的路径(默认当前路径) |
-n | 生成spec文件与exe文件的名字 |
-p | 指定额外import路径 |
-c, --console(默认) | 显示命令行窗口 |
-w, --noconsole | 不显示命令行窗口 |
-i | 修改icon(即修改程序图标) |
F:
cd F:\code\pycharm\Emotion-recognition
venv\Scripts\activate
pip install pyinstaller
注意:如果后续出现了报错:
FileNotFoundError: [Errno 2] No such file or directory: ‘…\astor\VERSION’
[8240] Failed to execute script test_exec
可以尝试将actor降级至0.7.1(转载:https://stackoverflow.com/questions/59985154/using-pyinstaller-to-convert-to-exe-filenotfounderror-c-users-8240-user)
pip uninstall actor
pip install actor==0.7.1
第一次打包该程序强烈建议不要关闭命令行窗口(下面这个语句是关闭了的,也可以在后面编辑spec文件中修改)
pyi-makespec -w real_time_video.py
执行上述语句后,spec文件内容如下,接下来我们要在上面添加语句
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['real_time_video.py'],
pathex=['F:\\code\\pycharm\\Emotion-recognition'],
binaries=[],
datas=[],
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,
[],
exclude_binaries=True,
name='real_time_video',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='real_time_video')
pyinstaller会自动搜索需要添加的文件,但有的时候搜索得并不全面,导致疯狂报错,不如我们把文件自己加进去。
Analysis(['real_time_video.py',
'xxx.py',
'./otherFolder/xxx.py'],
...)
如果有资源文件,可以在datas添加
datas=[('./font','font'),('./models', 'models'),('./haarcascade_files','haarcascade_files')]
如果pyinstaller搜索依赖模块时漏了几个,我们可以在hiddenimports添加
hiddenimports=['imutils','keras.models']
name='Emotion_recognition'
根据自身需求是否显示命令行窗口,在console修改
console=True
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['real_time_video.py'],
pathex=['F:\\code\\pycharm\\Emotion-recognition'],
binaries=[],
datas=[('./font','font'),('./models', 'models'),('./haarcascade_files','haarcascade_files')],
hiddenimports=['imutils','keras.models'],
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,
[],
exclude_binaries=True,
name='Emotion-recognition',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Emotion-recognition')
编辑完后保存,切换到命令行工具
这个时候使用pyinstaller执行spec文件就开始打包了
注意:千万不要写成pyinstaller real_time_video.py,运行py文件将自动生成spec文件,会将原来我们修改的spec文件覆盖掉
pyinstaller real_time_video.spec
当然也可以使用自定义参数
pyinstaller -D real_time_video.spec
之后耐心等待完成即可,这期间可能会出现问题,但是这种问题会因为程序的不同而不同,或者不会出现问题,这里不进行赘述。在上述生成spec文件时,在当前目录会生成build文件夹和dist文件夹,生成的可执行文件会保存在dist文件夹内。
仍是在命令行工具中,进入dist文件夹内exe文件路径,执行所生成的exe文件。
cd dist\Emotion-recognition
Emotion-recognition.exe
如果打包时设置命令行窗口是显示的,此时如果程序出现错误,将在命令行窗口内显示错误报告(我的程序是没有错误的,但是我仍删掉了一个资源文件模拟错误)
我们根据错误报告去修改就可以了,需要注意的是,缺什么文件直接丢到exe文件的路径就可以了,但这个过程在spec文件的编写中就已经告诉pyinstaller需要添加什么文件,不会出现这种错误,但是有一种情况:如果生成的是单个可执行文件(exe文件),那么资源文件是需要添加到exe文件路径下的,原因可能是因为,如果在你写的程序中,调用资源文件的方式使用的是路径的方式,那么程序便会按路径的方式搜索。如下:
detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml'
emotion_model_path = 'models/_mini_XCEPTION.102-0.66.hdf5'
直接把haarcascade_files文件夹和models文件夹扔到exe文件路径下即可。
确认无误后,把命令行窗口设置为不显示,重新生成一次exe文件就可以了(需要使用–clean命令或者直接删除build和dist文件夹)
至此,pyinstaller 打包exe文件说明结束。
感谢:
https://blog.csdn.net/weixin_42052836/article/details/82315118
https://blog.csdn.net/weixin_39000819/article/details/80942423