
参考
官网:http://www.pyinstaller.org/
pyinstaller参数使用
使用spec文件
安装
Windows依赖pypiwin32,新版的pyinstaller已经包含了该模块,不用单独安装。
1 | pipenv install pyinstaller |
运行
1 | pyinstaller [options] xxx.py |
完整的命令行:
1 | pyinstaller [options] script [script …] | specfile |
最简单的调用方式
1 | pyinstaller myscript.py |
常用参数
1 | -F 指定打包后只生成一个exe格式的文件 |
更详细的使用方法可以参考下载包里的doc目录下的Manual.html文件。
注意事项:
生成文件中,可能包含一个以warn开头的类似warndemo.txt的警告文件,是因为程序无法自动导入很多的库,使用-p参数添加搜索路径。
使用spec文件添加打包资源
如果不想每次都传入参数,可以使用配置文件spec。
创建spec文件
1 | pyi-makespec name.py |
或者将参数传进去
1 | pyi-makespec options name.py [other scripts …] |
从命令行传入的options和后面添加到spec文件是一样的效果。这里传入的option会自动填入spec文件对应的位置,也可以不传入options直接填写spec文件。
使用spec文件后,运行时不要指定py而直接指定spec文件:不能运行.py否则会讲sepc更改的内容清除掉
1 | pyinstaller myscript.spec |
注意:以上如果指定了options会被忽略并使用spec中的值。如,使用了spec之前又指定了-c,spec会一直保留配置
1 | exe = EXE(pyz, |
后面再使用spec指定命令行的-c就没有用了,则要修改spec中的console=True来显示控制台。
从spec文件创建时,只有以下命令行参数有效:
1 | --upx-dir= |
spec文件详解
1 | block_cipher = None |
有四个类实例:
- Analysis实例a:该项配置脚本名称,解析导入和依赖包
- PYZ
- EXE
- COLLECT
修改 spec文件将参数写到Analysis和EXE.
添加datas,-h帮助描述如下
1 | [--add-data <SRC;DEST or SRC:DEST>] |
windows上要使用分号,linux上要使用冒号。
是否使用分号或冒号分隔符取决于os.pathsep.
windows下,打开cmd,输入
1 | import os |
输出的是分号’;’。
注意:如果在Windows上使用了冒号,会报错:
1 | argument --add-data: invalid add_data_or_binary value |
使用add-data参数时会加入到spec文件的datas中(也可以直接写到spec中),如
1 | --add-data="assets/bg.jpg;assets" |
spec
1 | datas=[('assets/bg.png', 'assets')], |
修改exe图标
1 | pyinstaller -F -i some.ico demo.py |
需要注意:需要移动下生成可执行程序的位置,才可以显示图片。
-i 添加到了spec的exe实例中的icon参数
注意加的位置在exe中
1 | exe = EXE(pyz, |
添加static和template
将static和template的路径包含进去,这里要试用相对路径,且在Windows下打包要试用双反斜杠\
1 | datas=[('.//static','static'),('.//templates','templates')], |
配置好spec的datas参数,运行pyinstaller name.spec后会在dist文件下生成static和template两个文件夹。
生成
- dist文件夹(包含生成好的.exe)
- build文件夹(中间生成,没用,事后可以删掉)
- spec文件(要转换文件的同一目录下,用于生成exe文件,可以修改来自定义生成exe的属性)
不压缩生成的exe文件
不压缩打包的时候记得把所有的静态文件复制过去,包括icon和background。
遇到的问题
注意:到步骤
Looking for dynamic libraries
的时候超级慢,等了大概20分钟才继续下面的步骤。未找到加快的解决方法。
运行打包好后的exe报错:
1 | failed to execute script |
重新打包,去掉-w
参数,看console输入的错误后,调试。
1 | __main__.b is not a package |
这个x是模块名称,查看使用了相对导入,如from .a import b
.找到了一个相对清楚的解释.
修改为from c.a import b
, c为a的包名,再重新生成后OK。
图片资源没打包进去
试了下,代码中写的image必须使用绝对路径打包完才能显示出来。
使用官方小实例
下载Windows版本,解压后在根目录下的examples有很多官方的小实例

- 本文标题:pyinstaller打包exe
- 创建时间:2016-09-10 15:00:00
- 本文链接:2016/09/10/python/pyinstaller打包exe/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!