使用PyInstaller将flask打包为一个exe
PyInstaller
PyInstaller是一个将python项目打包为exe的第三方包。
PyInstaller官网
详细文档
直接在命令行使用pip进行安装:
pip install pyinstaller
打包方式
可以直接运行命令行打包,也可以通过编写脚本进行打包, 还可以执行*.spec配置进行打包。
1 命令行打包格式
官方文档提供的格式是这个:
pyinstaller [options] script [script …] | specfile
举个简单的例子就是
-直接命令行打包
pyinstaller options… ~/myproject/source/myscript.py
-spec文件打包
将配置写道spec文件,然后执行文件,比如:
pyinstaller "C:\Documents and Settings\project\myscript.spec"
其中参数部分在文档中写了很多,具体可以查看Options说明链接
2 写脚本打包
个人比较倾向于这种打包方式。
首先具体说一以下为什么,因为我在项目中增加了大量的第三方库,简单的使用命令行打包会出现打包失败或者运行后闪退等问题。原因是需要隐式的对一些第三方包进行导入,这个在参数中是提供的,就是:
--hidden-import MODULENAME, --hiddenimport MODULENAME
这样的话,如果每次都通过命令行打包,在需要隐式导入多个第三方包的时候,就会变得比较繁琐。另外为什么也不是spec文件呢?因为这个东西会被改写!比如有一次使用了命令行打包,则spec文件会根据命令行内容重新生成文件。
其实脚本打包本质上和命令行是一致的,只是利用了PyInstaller提供的run函数,将参数以数组的形式带入run函数的参数而已。
举个例子:
#import相关包
from PyInstaller.__main__ import run
if __name__ == '__main__':
#设置参数——携程数组,最后一个是入口文件,#'--hidden-import'就是隐式导入的包
opts = ['-D',
'--hidden-import', 'cython',
'--hidden-import', 'sklearn',
'--hidden-import', 'sklearn.utils._cython_blas',
'--clean',
'app.py']
#执行run函数
run(opts)
3 补充说明
我在falsk中增加了几个数据挖掘需要的包,numpy、pandas、matplotlib、scipy、sklearn等,但在打包的时候出现了大量报错。后来直接hidden import之后成功了。
4 打包过程说明
每次打包之后,会生成两个文件夹build和dist,其中dist是可以拷贝部署的,直接运行里面的*.exe即可。
另外要说明的是,似乎每次打包前要清空dist下的工程文件夹,或者增加-y参数,否则会报错无法继续打包。
Error: The output directory "C:\Users\nanhao\PycharmProjects\dap\dist\app" is not empty. Please remove all its contents or use the -y option (remove output directory without confirmation).
关于 -y 参数,可以试一下,因为有时候工程存到c盘用户文件夹下,可能会因为权限问题,出现拒绝访问。这时候可以手动将dist下的工程文件夹清空一下