每当写完一个脚本工具之后,我们常常被要求需要对客户友好一键式,能有多傻瓜式就多傻瓜式,更别去说给客户机器装些乱七八糟的运行环境,python的打包工具也很好几种,pyinstaller做为python程序打包成windows下的exe,还是非常给力的,当然,还有其它的一些比较好的作用于python打包工具,本人我只用过pyinstaller,对其它的不好评价,这里主要记录下pyinstaller在windows下对python程序打包,总之一句话:pyinstaller会把代码中所有涉及到有包或者库都抽离出来,exe运行的前再全部解压到一个目录下
pyinstaller的安装
在windows下,pyinstaller需要PyWin32的支持,当用pip安装pyinstaller时未找到PyWin32,会自动安装pypiwin32.
pyinstaller的官网其实有非常详细的步骤,最新版为pyinstaller-3.2.1
1 | ##使用pip安装 |
pyinstaller常用选项
pyinstaller安装好之后,便可以用来打包了,最常用的打包命令:
1 | #将所有文件打包成一个exe |
使用.SPEC文件
我们可以直接把命令写在一个叫.spec的文件中,这样就不用每次都写那么一长串命令,直接使用
1 | #使用.spec文件 |
.spec文件的内容格式如下:
1 | # -*- mode: python -*- |
spec中的datas选项
上面的命令中有个很重要的选项: datas,我们知道,在flask架构中,我们常用的项目结构一般都包含有static,用来存放一些引用的js,css文件等,template中则用来存放模板文件,这些文件夹都是在flask代码之外,flask在运行的时候是需要去找这些文件夹里的文件,那么在用pyinstaller打包时如何把这些额外文件夹一同打包进去呢,换一句话说:如何把我们在项目中引用的其它非二进制文件跟python程序打包在一个exe中,这就是datas需要做的
而在Flask的app.py中,app的声明应该如下:
1 | if getattr(sys, 'frozen', False): |
上面的added_files(这个名字可随意,只要跟Analysis中的datas配对即可)中指定了templates指向的当前目录下的templates,而且if/else保证了即使是单独使用python app.py运行项目也能跑起来
exe解压路径如果没有指定的话默认是在C:\Users***\AppData\Roaming\pyinstaller\下,在这目录下,你能看到很多pyd文件,当然这些都是被编译过的了,还有很多项目中import的库跟windows下的dll.