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\_MEIxxxx
或 C:\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 模块文件名。
如果报错:pyrcc5‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
先执行:
pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
再执行:
pyrcc5 icons.qrc -o icons_rc.py
完成编译后,你应该能够在应用程序的根目录中找到一个名为 “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左右
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)