Python py文件打包成 exe文件

文章目录

  • 安装 pyinstaller 模块
  • pyinstaller 的使用
  • pyinstaller 常用参数
  • 单文件打包
  • 多文件打包
  • 指定 exe 文件图标
  • 打包 python 文件依赖的资源文件(图片、音乐等)
  • 1、在打包文件加入以下代码
  • 2、生成 `.spec` 配置文件
  • 3、修改 `.spec` 配置文件
  • 3、打包文件
  • 4、运行打包后文件
  • 设置界面图标跟任务栏图标
  • 报错
  • 缩小生成的 exe可执行文件大小
  • 安装 pyinstaller 模块

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

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

    pyinstaller 的使用

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

    pyinstaller 常用参数

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

    pyinstaller.exe    test1.py  # 默认添加 参数 -D
    
    参数 说明
    -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 文件进行打包
    

    多文件打包

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

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

    指定 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)
    
    

    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]       # [去掉命令行弹窗/显示命令行弹窗]
    

    3、修改 .spec 配置文件

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

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

  • 第一个res代表需要打包的文件夹名res,其内部存放的全都是各种资源文件。
  • 第二个’res‘代表打包后在临时文件中的文件夹名称
  • 本地引用资源路径时就需要使用相对路径
    datas=[('load','load')],


    icon=['load\\图标.ico'],

    3、打包文件

    pyinstaller    musicplayer.spec
    
  • 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>
    
    

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

    pyrcc5 icons.qrc -o icons_rc.py
    

    “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)
    
    

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

    报错


    缩小生成的 exe可执行文件大小

    可执行文件大小和使用的python版本有关
    亲测,同样的代码和模块,使用 3.10.11 版本,生成文件大小未 20M左右
    使用 3.9.13 版本,生成文件大小未 7M左右

    作者:up up day

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python py文件打包成 exe文件

    发表回复