pyinstaller

python没有编译的过程,写好的脚本必须安装python环境才能运行,发给别人的话比较麻烦。搜索了一下,果真python要啥有啥……

将.py转换成.exe的工具有py2exe,pyinstaller。py2exe好像停止更新了,就使用pyinstaller吧。

安装pyinstaller

http://www.pyinstaller.org/

pyinstaller的官方网站

使用pip安装

pip install pyinstaller

或者升级软件包

pip install --upgrade pyinstaller

选项

常用选项

-h, --help显示帮助
-v, --version显示版本信息
--distpath DIRDIR 为存放.exe文件的路径(默认:./dist)
--workpath WORKPATHWORKPATH 为存放编译过程中临时文件的路径 (默认:./build)
-y, --noconfirm替换输出文件夹(默认:./dist)不提醒
--upx-dir UPX_DIRUPX(软件压缩工具)的路径
-a, --ascii不包含对unicode的支持(默认:如果可用便包含unicode)
--log-level LEVEL编译时控制台的输出信息。 LEVEL可以是 TRACE, DEBUG, INFO, WARN, ERROR, CRITICAL(默认:INFO)
--clean删除缓存和编译过程中的临时文件
-c, --console, --nowindowed运行exe时打开控制台窗口(默认)
-w, --windowed, --noconsole运行exe时不打开控制台窗口
-icon <FILE.ico or FILE.exe,ID or FILE.icns>为exe添加图标

生成选项

-D, --onedir为可执行文件创建单文件夹(默认)
-F, --onefile只创建单个可执行文件
--specpath DIRDIR 为存储生成的.spec的目录(默认:当前目录)
-n NAME, --name NAMENAME 为可执行文件的名称(默认:第一个脚本的名称)

依赖选项

--add-data <SRC;DEST or SRC:DEST>额外资源(图片、声音素材等)的路径。
SRC 为素材路径
DEST 为程序执行时相对素材的路径
相对路径开头不要有"\"
分隔符在Windows下为 ";" Linux下为 ":"
可重复使用
--add-binary <SRC;DEST or SRC:DEST>
-p DIR, --paths DIR搜索import的路径(就像PYTHONPATH)
使用 ":" 分隔多个路径或者重复使用该命令
--hidden-import MODULENAME, --hiddenimport MODULENAMEMODULENAME 为导入的包文件名
隐式导入可能无法被识别
导致出现ModuleNotFoundError: No module的错误此时需手动添加
可重复使用
--additional-hooks-dir HOOKSPATHHOOKSPATH 为hook文件的路径
可重复使用。 关于hooks
--runtime-hook RUNTIME_HOOKS运行时HOOK文件的路径
--exclude-module EXCLUDESEXCLUDES 为忽略导入的包名
--key KEY用于加密python字节码的密钥

开始打包

一般情况下,在.py所在文件夹,按住Shift右键打开PowerShell,输入以下命令即可:

pyinstaller -F hello_world.py

如果出现很多warning,不用担心,他们大部分是无害的,忽略掉就可以了

a

然后在dist文件夹下可以找到编译出的可执行文件

可执行文件可能会很大,因为pyinstaller需要把包含的包也一并打包,所以导入包的时候,最好使用from...import,避免导入整个包

包含图片、声音等资源

pyinstaller默认并不会打包程序依赖的素材资源,如果程序有依赖这些资源,运行将会出错

我们需要手动添加这些资源

假设我的文件结构是这样的,Alien_Invasion.py 是主程序

依赖的素材位于images文件夹

方法一:使用--add-data参数

--add-data可以让我们添加其他的资源一并打包,具体说明见上方

pyinstaller --add-data 'images\alien.bmp;images' --add-data 'images\ship.bmp;images' -F Alien_Invasion.py

linux下分隔符;要改为:

分隔符左边是素材的路径;右边是程序运行时,素材相对程序的路径

值得一提的是,相对路径最前面不要加斜杠,否则会打包失败

方法二:修改.spec文件

首先使用pyi-makespec命令生成一个.spec文件(实际上使用pyinstaller命令直接打包也会生成一个.spec文件)

pyi-makespec Alien_Invasion.py

生成的文件如下

我们在a.data[]中添加元组,定义素材的路径

('images\\alien.bmp', 'images'), ('images\\ship.bmp', 'images')

添加后的.spec文件

然后输入命令打包

pyinstaller -F hello_world.spec

注意后缀名是.spec,写成.py的话又要重新生成.spec文件,白白改了