• 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
    
    • 1
    • 更新版本
    pip install --upgrade pyinstaller
    
    • 1
    • 从github上安装开发版本
    pip install https://github.com/pyinstaller/pyinstaller/tarball/develop
    
    
    • 1
    • 2

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

    在这里插入图片描述

    使用Pyinstaller

    • python脚本
    import tkinter
    
    top = tkinter.Tk()
    top.mainloop()
    
    • 1
    • 2
    • 3
    • 4
    • 打包命令
    pyinstaller main.py
    
    • 1
    • 显示效果
      运行效果

    最基本的命令,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
    
    • 1

    在这里插入图片描述

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

    • -F
    pyinstaller -F main.py
    
    • 1

    在这里插入图片描述

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

    • -specpath
    pyinstaller -specpath spec main.py
    
    • 1

    在这里插入图片描述

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

    • -n
    pyinstaller -n main2 main.py
    
    • 1

    在这里插入图片描述

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

    打包资源和搜索

    • –add-data
    pyinstaller --add-data res:res2 main.py
    
    • 1

    在这里插入图片描述

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

    • –add-binary
    pyinstaller --add-data /lib/test.dll;. main.py
    
    • 1

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

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

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

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

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

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

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

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

    在指定目录下搜索文件

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

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

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

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

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

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

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

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

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

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

    • –runtime-hook RUNTIME_HOOKS

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

    –exclude-module EXCLUDES

    pyinstaller --exclude-module tkinter main.py
    
    • 1

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

    • –key KEY

    用于加密 Python 字节码的密钥

    –splash IMAGE_FILE

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

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

    其他命令

    • -w
    pyinstaller -F -w main.py
    
    • 1

    在这里插入图片描述

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

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

    在这里插入图片描述

    给打包出来的exe设置icon

    spec文件打包exe

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

    pyinstaller main.spec
    
    • 1

    在这里插入图片描述

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

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

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

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

    pycharm设置快捷打包

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

    file——>Settings——>Tools——>External Tools
    
    • 1

    在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文件

    
        
            res/select.png
            res/u_s.png
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    首先创建一个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')))
    
    • 1
    • 2
    • 3
    • 4

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

    推送

    • Github
    https://github.com/KingSun5
    
    • 1

    结语

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

  • 相关阅读:
    数据结构与算法复习:第三十五弹
    由对称引起的空间结构耦合效应
    用crash tool观察ARM64 Linux地址转换
    MYSQLg高级------聚簇索引和非聚簇索引
    MySQL 索引底层 B+Tree 原理解析
    基于SpringBoot的在线点餐系统【附源码】
    UE5制作场景时的小技巧和注意事项
    JC/T 1006-2018 釉面钢化及半钢化玻璃检测
    express脚手架安装
    ovalbumin/OVA-Nitrophenyl Carbonates 鸡卵白蛋白-硝基苯碳酸盐
  • 原文地址:https://blog.csdn.net/Mr_Sun88/article/details/127823361