使用PyInstaller创建可执行应用

PyInstaller是一个十分有用的第三方库。它会通过对源文件的打包,让Python程序在没有安装Python的环境中运行,也可以作为一个独立文件传递和管理。

在命令行中使用pip install pyinstaller即可完成PyInstaller的安装。

PyInstaller的使用也很简单,最简单的使用方法就是将程序的主文件传递给它,例如pyinstaller ./main.py。这样PyInstaller会生成两个目录,一个是build,用来放置生成过程中产生的文件,一个是dist用于放置最后生成的可执行文件和动态链接库,并且还会生成一个用于描述编译配置的.spec文件。

PyInstaller在使用时需要注意一下两点:

  1. 文件路径中不能出现空格和英文句号;
  2. 源文件必须是UTF-8编码。

一般一个应用在打包后应该与从源码执行拥有相同的行为特性,但是打包后的应用,其工作目录会发生变化。首先操作应用包外的目录和操作应用包内的目录会有区别。PyInstaller的Bootloader在sys模块中添加了一个属性来方便程序判断自身的运行状态。以下是一个常见的判断示例。

import sys


if getattr(sys, 'frozen', False):
	# 当前在打包状态下运行
else:
	# 当前在源码状态下运行

程序在不同的状态下运行,寻找相关文件和信息的方式也会有所不同,比如打包状态下可能会将配置信息保存在系统提供的应用数据目录中,而从代码运行则常常放在源码目录中。当程序在源码状态下运行时,我们一般会使用__file__来获取源码文件的绝对路径,但是在打包状态下,这个路径就会变为打包应用的路径,而不是代码文件的路径,所以PyInstaller提供了sys._MEIPASS来获取打包目录的绝对路径。