• Python py文件打包成 exe文件


    安装 pyinstaller 模块

    pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    
    • 1
    • 2

    在 pyinstaller 模块安装成功之后,在 Python 的安装目录下的 Scripts 目录下会增加一个 pyinstaller.exe 程序,接下来就可以使用该工具将 Python 程序生成 EXE 程序了。

    pyinstaller 的使用

    pyinstaller 需要在命令行下使用,如果 pyinstaller.exe 所在目录没有加入环境变量,pyinstaller 安装成功后会有下图提示,并显示 pyinstaller.exe 所在绝对路径,后续在使用的时候需要带上绝对路径

    在这里插入图片描述

    pyinstaller 常用参数

    在命令行如果不加参数,默认添加 参数 -D

    pyinstaller.exe    test1.py  # 默认添加 参数 -D
    
    • 1
    参数说明
    -F产生单个的可执行文件,使用此参数,将会在脚本目录下生成一个 dist 目录,并在该目录下看到有一个 app.exe 文件,该 app.exe 文件可以单独运行
    -D产生一个目录(包含多个文件)作为可执行程序,使用此参数,将会在脚本目录下看到多了一个 dist 目录,并在该目录下看到有一个 app 子目录,在该子目录下包含了大量 .dll 文件和 .pyz 文件,它们都是 app.exe 程序的支撑文件,该 app.exe 文件不能单独运行
    -w指定程序运行时不显示命令行窗口(仅对 Windows 有效)
    -c指定使用命令行窗口运行程序(仅对 Windows 有效)

    单文件打包

    Pyinstaller name.spec  # 1、以 spec 文件进行打包
    Pyinstaller name.py  # 2、以 py 文件进行打包
    
    • 1
    • 2

    多文件打包

    多文件打包和单文件相同,只需要保证含有主函数的脚本能正确运行,其他依赖文件就可以省略

    pyinstaller.exe    test1.py  # 只需要跟带主函数的脚本,其他依赖文件可以省略
    
    • 1

    指定 exe 文件图标

    pyinstaller -F -w main.py -i logo图片地址.ico

    打包 python 文件依赖的资源文件(图片、音乐等)

    1、在打包文件加入以下代码

    import os
    import sys
    
    
    # 资源文件目录访问
    def source_path(relative_path):
        # 是否Bundle Resource(打包)
        # 判断是否存在属性frozen,以此判断是打包的程序还是源代码。false为默认值,即没有frozen属性时返回false
        if getattr(sys, 'frozen', False): 
            base_path = sys._MEIPASS # 该属性也是打包程序才会有,源代码尝试获取该属性会报错
        else:
        	# 当源代码运行时使用该路径
        	# os.path.abspath()函数是用来获取绝对路径的函数,它可以将相对路径转换为绝对路径。
            base_path = os.path.abspath(".")
        return os.path.join(base_path, relative_path)
    
    
    # 修改当前工作目录,使得资源文件可以被正确访问
    cd = source_path('')
    os.chdir(cd)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    getattr()

    getattr() 是 Python 内置的一个函数,可以用来获取一个对象的属性值或方法。其基本语法为:
    getattr(object, name[, default])

    • object 是要获取属性值或方法的对象;
    • name 是要获取的属性名或方法名;
    • default 是可选参数,当指定的属性或方法不存在时,会返回 default 的值。

    Python中 sys._MEIPASS 是什么?
    用 pyinstaller 打包生成的 exe 文件,在运行时动态生成依赖文件,sys._MEIPASS 就是这些依赖文件所在文件夹的路径

    通常 C:\Windows\Temp\_MEIxxxxC:\Users\用户名\AppData\Local\Temp\_MEIxxxx

    2、生成 .spec 配置文件

    这里打包的主函数入口文件不能定义为 main.py ,否则影响后面的图标设置

    pyi-makespec -F -w musicplayer.py    # musicplayer 是主程序的 musicplayer.py名字
    #[-F/-D]       # [产生当个可执行文件/产生一个目录(包含多个文件)作为可执行文件]
    #[-w/-c]       # [去掉命令行弹窗/显示命令行弹窗]
    
    • 1
    • 2
    • 3

    3、修改 .spec 配置文件

    1、 修改修改 datas
    此列表内可以加入一个元组(注意,此元组最多可以有两个元素)指定要打包的资源和打包后在临时文件夹内的文件夹名称。

    比如“datas=[(‘res’,‘res’)]”:

    • 第一个res代表需要打包的文件夹名res,其内部存放的全都是各种资源文件。
    • 第二个’res‘代表打包后在临时文件中的文件夹名称

    本地引用资源路径时就需要使用相对路径
    datas=[('load','load')],
    在这里插入图片描述
    在这里插入图片描述
    icon=['load\\图标.ico'],
    在这里插入图片描述

    3、打包文件

    pyinstaller    musicplayer.spec
    
    • 1
    • pycharm 中打包,路径不能有中文: raise Exception(f"Qt plugin directory ‘{plugin_src_dir}’ does not exist!")
      Exception: Qt plugin directory ‘C:/Users/¶ÅÇì¶«/PycharmProjects/ú̿¼ì²âÊýÖµ´¦Àí³ÌÐò/venv/lib/site-packages/PyQt5/Qt5/plugins’ does not exist!
      • 使用python打包程序时(因含中文名)报错
    • pycharm 中 pyinstaller 打包 win32ctypes.pywin32.pywintypes.error: (225, ‘’, ‘无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。’)
      • 将pyinstaller 6.3.0,卸载后,安装6.2.0重新打包即可
      • pip install pyinstaller==6.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

    4、运行打包后文件

    程序运行时就会在临时文件夹下创建响应的文件夹,并在里面添加资源文件

    在这里插入图片描述

    设置界面图标跟任务栏图标

    在 PyQt 中,你可以使用 pyrcc 工具将 .qrc 文件编译为 Python 模块,然后将这个模块导入到你的程序中,从而设置应用程序图标和任务栏图标。

    首先,你需要创建一个 .qrc 文件,该文件应该包含应用程序图标和任务栏图标的资源。例如,你可以创建一个名为 “icons.qrc” 的文件,包含以下内容:

    “icon.png” 是你想要设置的应用程序图标和任务栏图标的文件名。

    <!DOCTYPE RCC><RCC version="1.0">
    <qresource>
        <file>icon.png</file>   
    </qresource>
    </RCC>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用 pyrcc 工具将 .qrc 文件编译为 Python 模块。在命令行中输入以下命令:

    pyrcc5 icons.qrc -o icons_rc.py
    
    • 1

    “icons_rc.py” 是你想要指定的 Python 模块文件名。

    完成编译后,你应该能够在应用程序的根目录中找到一个名为 “icons_rc.py” 的文件。这个文件包含了你在 .qrc 文件中定义的资源。

    接下来,在你的 PyQt 程序中,你可以使用以下代码来设置应用程序图标和任务栏图标:

    from PyQt5.QtGui import QIcon
    import ctypes
    
    import icons_rc  # 导入编译后的 .qrc 文件
    
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon(':/icon.png'))  # 设置应用程序图标
    
     # 设置任务栏图标
    my_app_id = 'my_company.my_product.sub_product.version'  # 替换为你的应用程序 ID(可以不改)
    ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(my_app_id)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    “:/icon.png” 是从编译后的 .qrc 文件中加载图标的语法。

    报错

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

  • 相关阅读:
    代码随想录算法训练营Day44 | 动态规划(6/17) 完全背包理论基础 LeetCode 518. 零钱兑换 II 377. 组合总和 Ⅳ
    设计模式之桥梁模式
    DSP篇--C6678功能调试系列之EMIF、GPIO调试
    基于C语言开发实现的一个用户级线程库
    2022SDNU-ACM结训赛题解
    Algorithm基础算法学习
    【每日练习】删除公共字符
    快递鸟顺丰、申通物流查询类通用接口文档
    Linux-0.11 文件系统exec.c详解
    面前是惊涛骇浪:对当下的经济困境,货币政策和大类资产的看法
  • 原文地址:https://blog.csdn.net/m0_56208280/article/details/133029963