python代码打包成可执行文件(exe)
【前言】:我们在开发完一个小项目后,想要把项目发布出来给别人用。通常都会把代码打包成exe后再给别人,而不是让别人去安装运行环境再跑裸代码。本文就是介绍如何使用pyinstaller这个工具将python带包成可直接运行的exe。
▍概述
在介绍pyinstaller之前,先简单介绍下其它几个可以用于打包python代码的工具:
-
cx_Freeze:可以将Python脚本转换为独立的可执行文件,支持多个平台。
-
PyInstaller:可以将Python脚本(或模块)转换为单个可执行文件或目录,支持多个平台。
-
PyOxidizer:功能类似于PyInstaller,但它可以生成自包含的二进制文件,可以跨平台使用。
-
Py2exe:仅适用于Windows平台,可以将Python脚本转换为.exe可执行文件。
Pyinstaller打包代码的步骤有:
-
使用pip install pyinstaller命令安装pyinstaller库。
-
pyinstaller提供两种打包方式;
**方式一:**在cmd终端进入要打包的Python文件所在目录,使用pyinstaller xxx.py命令打包代码。
**方式二:**在cmd终端进入要打包的Python文件所在目录,使用pyi-makespec xxx.py命令生成spec文件,然后对spec需要修改的区域做修改,再使用pyinstaller xxx.spec命令打包代码。
-
使用pyinstaller打包成功之后,产生两个文件夹:
build文件夹:这是打包过程中临时文件的存放位置。这些文件包括 Python 源代码、打包脚本和其他一些中间文件。在成功打包应用程序后,该目录可以被安全地删除。
dist文件夹:这是最终生成的可执行文件及其依赖项的存放位置。
▍方式一:命令行直接打包
使用命令行打包通常适用于简单的项目,不需要复杂的配置或自定义设置,也无需频繁重复打包的情况;假设我们的python代码如下,文件名为demo.py。
#demo.py
import os
path=os.getcwd()
print(f'当前文件路径:{path}')
os.system('pause')
打包步骤:
1. 在cmd终端中进入demo.py文件的所在目录。
2. 终端执行:pyinstaller -F demo.py
指令解释:
pyinstaller
[-F/-D] # [产生当个可执行文件/产生一个目录(包含多个文件)作为可执行文件]
[-w/-c] # [去掉命令行弹窗/显示命令行弹窗]
-i icon.ico # 指定exe显示图标
demo.py #打包的python文件
结果:
打包完成后在demo.py文件所在目录下生成build和dist两个文件夹,dist目录下的demo.exe即为我们打包后的可执行文件。点击demo.exe文件弹出小黑窗即为打包成功。
▍方式二:使用spec打包
spec文件打包适用于更大规模、更复杂的项目,以及需要自定义配置和频繁重复打包的时候使用;需要使用 .spec 文件进行打包的情况有:
-
有数据文件需要一起打包
-
把动态链接库一起打包
-
添加运行时选项
-
想要生成多个可执行程序,公共的模块分割出来给其他调用
假设我们的项目文件结构如下图所示。
PackingExe
|_ core
|_ __init__.py
|_ dict.txt
|_ demo.py
demo.py文件
def resource_path(relative_path):
""" 运行exe时获取资源文件的绝对路径"""
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
def main():
print(f'当前文件路径:{os.getcwd()}')
abs_path = resource_path('core/dict.txt')
with open(abs_path, 'r', encoding='utf-8') as file:
content = file.readline()
print(content)
os.system('pause')
if __name__ == "__main__":
main()
此处解释一下资源路径函数(resource_path);当exe在运行时,会生成一个临时文件夹,除代码之外的数据资源需要通过sys._MEIPASS访问临时文件夹获取。
打包步骤:
1. 在终端中进入PackingExe目录。
2. 生成spec文件:pyi-makespec -F demo.py # 生成apec文件,支持-F,--key等参数,不支持--upx-dir
3. 修改spec文件
4. 执行打包命令:pyinstaller demo.spec # 使用spec文件打包,不支持外部参数
如何正确编辑spec文件?
spec文件主要包含四个类:
-
Analysis类:用于分析 Python 模块之间的依赖关系,并对需要的东西进行打包。
-
PYZ类:是一个由多个Python文件组成的二进制文件。PYZ文件内部包含整个程序的代码和标准库,以及在脚本代码中使用的所有第三方库。
-
EXE类:指定要生成的可执行文件的相关信息,例如名称、平台、图标等。
-
COLLECT类:用于收集所有需要包含在可执行文件中的文件,并将其复制到构建目录中以供打包和部署使用。在-F模式下,是没有COLLECT类。
用于打包PackingExe项目的spec文件如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['demo.py'],
pathex=[],
binaries=[],
datas=[('coredict.txt', 'core')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='demo',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
结果:
打包完成后在demo.py文件所在目录下生成build和dist两个文件夹,dist目录下的demo.exe即为我们打包后的可执行文件。点击demo.exe文件弹出小黑窗即为打包成功。
▍可能打包失败的原因
-
程序有bug时,打包后的exe会出现闪退,而不是在小黑窗上报错;
-
用于打包的python解释器路径不能有中文或空格;如果必须有可以修改python安装目录下的scripts/pyinstaller-script.py文件中的python.exe路径;
-
最好在py文件首行添加# -*- coding:utf-8 -*-,否则exe容易编码错误;
相关代码资料已经打包好,领取方式看下方
除上述资料外,还附赠全套Python学习资料,包含面试题、简历资料等具体看下方。
?福利? 全网最全《Python学习资料》免费赠送?!
最近火热ChatGPT 等人工智能应用对 Python 编程语言产生了积极的影响,它推动了 Python 的普及和发展,在文本处理和 NLP 领域提升了 Python 的地位,促进了 Python 生态系统的成长
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python学习路线
二、Python基础学习
1. 开发工具
2. 学习笔记
3. 学习视频
三、Python小白必备手册
四、数据分析全套资源
五、Python面试集锦
1. 面试资料
2. 简历模板
因篇幅有限,仅展示部分资料,添加上方即可获取。