pyinstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个 独立文件方便传递和管理。

PyInstaller支持Python 2.7和Python 3.3+。可以在Windows、Mac OS X和Linux上使用,但是并不是跨平台的,而是说你要是希望打包成.exe文件,需要在Windows系统上运行PyInstaller进行打包工作;打包成mac app,需要在Mac OS上使用。

一、安装

pip install pyinstaller

该命令会将所需要的依赖安装到python安装目录的script文件夹中,如果你安装python时已经配置了python的环境变量,应该会有script文件夹的环境变量配置,可以直接在cmd中使用pyinstaller命令

环境变量示例:C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Scripts\

二、参数帮助

可选参数 描述
-F 生成单个的可执行文件
-h 查看该模块的帮助信息
-v 查看该模块的版本信息
-D 创建一个包含可执行文件的单文件夹捆绑包
-n 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
-d 产生 debug 版本的可执行文件
-w 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c 定使用命令行窗口运行程序(仅对 Windows 有效)
-o 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件

三、生成可执行文件

pyinstaller -F -w main.py

main.py就是程序启动的类,自行替换

打包完成后会在当前目录下生成两个目录和一个spec文件

分别是build、dist、main.spec

其中dist保存了打包后的可执行文件,spec则是打包时可选的配置文件

四、打包资源文件

打包后可执行文件中只有.py文件,程序中的配置文件和资源文件都没有,需要通过spec将所需要打包的文件配置进去。

sepc中datas选项即为配置文件映射,其格式为[(‘源文件’,’打包后的目录’),(‘源文件’,’打包后的目录’)]

我的根目录中有两种类型的文件需要打包,我们创建一个数组如下:

resource_data = [
('*.json','.'),
('*.yml','.')
]

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=resource_data,
    hiddenimports=[],
    hookspath=[],  
    hooksconfig={},
    runtime_hooks=[],  
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

5、访问打包后的资源文件

打包后的文件无法直接访问,需要使用特定的访问路径,我们写一个方法传入一个路径返回打包后的真实路径,并判断是否为打包后的文件,如果是则使用打包后的路径如果不是则使用当前路径

def resource_path(self, relative_path):
    if getattr(sys, 'frozen',False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path,relative_path)

6、重新打包有资源文件后的可执行文件

配置完成后我们直接使用spec的配置进行重新打包可执行文件中就有资源文件了

pyinstaller main.spec