Python py文件打包成 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 文件中加载图标的语法。

报错

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值