python:pyinstaller打包python成exe常用命令,解决pyqt5中图片资源打包后不显示的问题

前言

用python写可视化工具的时候,并不是所有人都有相关的环境,这就需要给部分使用的人去打成可执行文件exe,这里面需要用到pyinstaller第三方库

官方文档地址

  • https://pyinstaller.org/en/stable/usage.html

英语好的可以直接看文档了,没有中间商

什么是pyinstaller

PyInstaller是python的第三方库

PyInstaller可以读取Python脚本,解析脚本执行依赖的所有模块和库,然后收集所有这些文件的副本,包括活动的Python解释器,并将它们与python脚本放在一个文件夹中,或者编译成一个可执行文件

pyinstaller的安装

安装

  • pip安装
pip install pyinstaller
  • 更新版本
pip install --upgrade pyinstaller
  • 从github上安装开发版本
pip install https://github.com/pyinstaller/pyinstaller/tarball/develop

安装没什么好说的,直接用pip安装pyinstaller就可以了,这里有一点注意,博主环境是python3.7,python2好像有点问题,安装失败可以考虑下是不是python版本问题,安装完后,我们可以切到python的scripts目录下执行pyinstaller,如上图所示,就是安装成功了,并且可以看到相关的命令

在这里插入图片描述

使用Pyinstaller

  • python脚本
import tkinter

top = tkinter.Tk()
top.mainloop()
  • 打包命令
pyinstaller main.py
  • 显示效果
    运行效果

最基本的命令,main.py脚本用tkinter生成了一个最简单的弹窗,在执行命令时会做一下几个操作:

  • 生成.spec文件

会在main.py同级目录生成main.spec文件,spec文件包含了很多打包信息和参数,可以执行被用来执行打包命令,详细在后面

  • 生成build文件

若mian.py统计目录下build文件不存在,则会生成一个,在文件中写入一些日志文件和工作文件build,该文件存在会提高打包效率

  • 生成dist文件

若mian.py统计目录下dist文件不存在,则会生成一个,会在文件下生成main的可以执行文件exe和一些依赖库

在这里插入图片描述

pyinstaller打包常用的命令

生成

  • -D
pyinstaller -D main.py

在这里插入图片描述

和pyinstaller main.py作用一样,会在dist下生成一个目录,包含依赖库和可执行文件exe

  • -F
pyinstaller -F main.py

在这里插入图片描述

在dist下生成一个单一的执行文件exe

  • -specpath
pyinstaller -specpath spec main.py

在这里插入图片描述

给生成的spec文件设置一个路径,不设定的话就是生成在main.py的同级目录下

  • -n
pyinstaller -n main2 main.py

在这里插入图片描述

给生成的exe文件设置名字,默认就是和脚本同名

打包资源和搜索

  • –add-data <SRC;DEST or SRC:DEST>
pyinstaller --add-data res:res2 main.py

在这里插入图片描述

将SRC资源路径打进包内,打进包的路径是DEST

  • –add-binary <SRC;DEST or SRC:DEST>
pyinstaller --add-data /lib/test.dll;. main.py

同add-data类型,add-binary用在dll等文件的打包,后边用.指的是放在最外层目录

  • -p DIR
pyinstaller -p D:\Lib main.py

添加打包是的搜索路径,就是在打包的时候在设定的搜索目录下寻找第三方依赖文件,建议用到外部库的都粘到目录下,这功能感觉比较鸡肋啊,基本用不到

  • –hidden-import
pyinstaller --hidden-import messagebox._win32 main.py

官方的解释是可以导入一些隐式调用的包,博主在碰到过得情况是打包后依然会显示缺少某些模块,比如打包win32窗体的应用时,会显示ImportError: No module named ‘win32’,这个时候就用到了上述代码

  • –collect-submodules MODULENAME
pyinstaller --collect-submodules C:\Python37\Scripts main.py

跟–hidden-import 作用相同,不过这里是指定目录,不是直接指定包名

  • –collect-data MODULENAME
pyinstaller --collect-data C:\Python37\Scripts main.py

在指定目录下搜索文件

  • –collect-binaries MODULENAME
pyinstaller --collect-binaries C:\Python37\Scripts main.py

在指定目录下搜索数据文件

  • –collect-all MODULENAME
pyinstaller --collect-binaries C:\Python37\Scripts main.py

在指定目录下搜索所有文件

  • –copy-metadata PACKAGENAME
pyinstaller --copy-metadata pyqt5_plugins main.py

只拷贝指定模块的元数据到包内

  • –recursive-copy-metadata PACKAGENAME
pyinstaller --recursive-copy-metadata pyqt5_plugins main.py

复制指定包及其所有依赖项的元数据,相比–copy-metadata,复制了其依赖项的数据

  • –additional-hooks-dir HOOKSPATH
转载:https://zhuanlan.zhihu.com/p/37764866

就是在打包的时候添加一些会被特定触发的钩子文件,和git的hook类似,博主没用过这个,引用一篇文章可以参考一下(这些hook的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑)

  • –runtime-hook RUNTIME_HOOKS

自定义运行时挂钩文件的路径。运行时挂钩是与可执行文件捆绑在一起的代码,在任何其他代码或模块之前执行以设置运行时环境的特殊功能。此选项可以多次使用

–exclude-module EXCLUDES

pyinstaller --exclude-module tkinter main.py

忽略某些包或者模块,不拷贝进包里,如上述命令,tkinter相关的包和依赖就不会被拷贝

  • –key KEY

用于加密 Python 字节码的密钥

–splash IMAGE_FILE

pyinstaller --splash "C:\Users\Administrator\Desktop\start.png" main.py

加闪屏动画的,就是应用启动时的图像

其他命令

  • -w
pyinstaller -F -w main.py

在这里插入图片描述

windwos上执行打包后,运行exe文件会有一个cmd的命令行输出框,看着很不优雅,-w命令可以去掉

  • -i
pyinstaller -i C:\Users\Administrator\Desktop\icon.png main.py

在这里插入图片描述

给打包出来的exe设置icon

spec文件打包exe

我们之前一直都在用各种命令去打包exe,其实还有个相对简单点的方式去打包,就是利用生成的spec文件,如下所示:

pyinstaller main.spec

在这里插入图片描述

不用加任何-F,-D的指令,上述命令可以按照上次打包时的指令生成exe,spec文件存的就是上次打包时的命令

pyinstaller main.py -i C:\Users\Administrator\Desktop\icon.png --hidden-import messagebox._win32

在这里插入图片描述
在这里插入图片描述

每次在执行python脚本打包的时候,所用的命令,就会生成对应的spec文件,如上述命令和spec展示所示,如此我们可以直接在spec文件内配置,就不用每次打包输入繁琐的指令了

pycharm设置快捷打包

在这里插入图片描述
在这里插入图片描述

file——>Settings——>Tools——>External Tools

在pycharm中我们可以设置快捷键打包

在这里插入图片描述

  • Name:名字
  • Program:这里指向你python目录下的python.exe可执行文件
  • Arguments:$ FileNameWithoutExtension $.spec(记得去空格)
  • working directory:$ FileDir $(记得去空格)

点击左上角+号,在弹出面板填入参数,Arguments是具体的指令,这里是只执行一个spec文件,你也可以设置具体的指令 -F -w F i l e File File.py,这样的

pyqt5打包后图片不显示

在用pyqt5制作应用的时候,发现一个问题,打包进应用里的图片不能正常显示,找了半天也没找原因,查了一下,发现有万能的网页提供了相关的解决思路,试了一下没问题

解决思路

1、读取图片字节流,用base64编码
2、将编码后的数据存到一个python文件内
3、在代码内,import这个py脚本

图片写入qrc文件

<RCC>
    <qresource prefix="/">
        <file>res/select.png</file>
        <file>res/u_s.png</file>
    </qresource>
</RCC>

在这里插入图片描述

首先创建一个qrc文件,然后把图片信息都写进去

做个快捷执行命令

在这里插入图片描述

  • Name:名字
  • Program:这里指向你python目录下的pyrcc5.exe可执行文件
  • Arguments: F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension_rc.py
  • working directory: F i l e D i r FileDir FileDir

这里用pyrcc5直接去把qrc文件转成py文件,pyrcc5模块,装了pyqt5就也装好了,找一下你自己的目录就行

图片转换

在这里插入图片描述

在qrc文件下直接右键选择刚才做好的快捷命令,然后就可以在统计目录下生成一个py文件

引用py显示图片

import images_rc


tempBtn.setIcon(QIcon(QPixmap(':/res/select.png')))

在显示图片的脚本里引用刚生成的py文件,就可以想平常一样显示图片了,但是这里加载图片需要多些一个冒号

推送

  • Github
https://github.com/KingSun5

结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
本文属于原创文章,转载请著名作者出处并置顶!!

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值