python 使用 pyinstaller 打包 exe 文件

python 使用 pyinstaller 打包 exe 文件

在网上找pyinstaller资料时,发现大家提供的方法仅对简单的程序有效,而略复杂的程序各种报错,在这篇推文中我会阐述具有鲁棒性的pyinstaller打包方法。官网:http://www.pyinstaller.org/

pyinstaller 常见参数


参数 解释
-F, --onefile 生成单个exe文件
-D, --onedir(默认) 生成一个exe文件与依赖库分开的目录
–clean 清空上一次编译产生的所有文件
–specpath 生成spec文件的路径(默认当前路径)
-n 生成spec文件与exe文件的名字
-p 指定额外import路径
-c, --console(默认) 显示命令行窗口
-w, --noconsole 不显示命令行窗口
-i 修改icon(即修改程序图标)

事先说明

  • 以下操作我是在虚拟环境进行
  • 打包文件为 real_time_video.py

准备工作

  • 进入项目路径
F:
cd F:\code\pycharm\Emotion-recognition
  • 使用虚拟环境
venv\Scripts\activate
  • 下载 pyinstaller
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文件

第一次打包该程序强烈建议不要关闭命令行窗口(下面这个语句是关闭了的,也可以在后面编辑spec文件中修改)

 pyi-makespec -w real_time_video.py

编辑spec文件

执行上述语句后,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
    以py文件为输入,分析py依赖模块,生成相应信息
    如果有多个py文件存在联系,可以在Analysis第一个括号内添加
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']
  • PYZ
    .pyz的压缩包,包含程序运行需要的所有依赖
  • EXE
    根据上两项生成
    如果需要修改exe名字,可以在name修改
name='Emotion_recognition'

根据自身需求是否显示命令行窗口,在console修改

console=True
  • COLLECT
    生成其他部分的输出文件夹,COLLECT也可以没有。如果想生成单个可执行文件而不想要可执行目录的话,可以把COLLECT的非重复内容添加到EXE,然后删除COLLECT。
# -*- 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')

编辑完后保存,切换到命令行工具

执行spec文件

这个时候使用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

如果打包时设置命令行窗口是显示的,此时如果程序出现错误,将在命令行窗口内显示错误报告(我的程序是没有错误的,但是我仍删掉了一个资源文件模拟错误)
python 使用 pyinstaller 打包 exe 文件_第1张图片
我们根据错误报告去修改就可以了,需要注意的是,缺什么文件直接丢到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

你可能感兴趣的:(python学习笔记)