使用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下的工程文件夹清空一下

你可能感兴趣的:(使用PyInstaller将flask打包为一个exe)