python整个项目打包成一个exe程序

#已安装python环境

一、安装PyInstaller 模块

pip install pyinstaller

运行上面命令,应该看到如下输出结果:

Successfully installed pyinstaller-x.x.x

其中的 x.x.x 代表 PyInstaller 的版本

pyinstaller打包程序exe踩过的坑

1.提示:TypeError: an integer is required (got type bytes) 解决方法如下:

将flask程序封装为一个docker容器 flask项目打包成exe_资源文件

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz

2.然后会出现另外一个异常 AttributeError: module ‘enum’ has no attribute ‘IntFlag’? 解决办法如下:

将flask程序封装为一个docker容器 flask项目打包成exe_pyinstaller_02


这可能是由包Enum34引起的。因为Python3.4有一个标准库枚举模块,所以您应该卸载Enum34,因为在Python3.6中添加了Enum.Intflag,所以它不再与标准库中的枚举兼容。

#卸载enum34

pip uninstall enum34

备注:用不了pip的网友,可直接删掉\Lib\site-packages\enum打头的两个文件夹即可!

二、打包python项目

如项目在对应的目录

将flask程序封装为一个docker容器 flask项目打包成exe_windows_03


1.在cmd中进入对应的项目目录路径

将flask程序封装为一个docker容器 flask项目打包成exe_pyinstaller_04


2. 修改.PY文件(因为打包成exe文件后,会发送给其他同事使用,路径发生变化)

需要在读取资源文件的地方调整我们的代码,加入下面的代码:

#coding:utf-8
import sys
import os

#生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

filepath = resource_path(os.path.join("PATH"))#读取资源文件夹PATH路径

将flask程序封装为一个docker容器 flask项目打包成exe_pyinstaller_05


3. 生成.SPEC文件并修改

修改完.py文件后可以先运行一下,保证无误。然后通过cmd指令:

pyi-makespec -F beloved.py

生成.spec文件。如果要添加Icon等可以在这里就使用pyi-makespec --icon abc.jpg -F test.py语句生成spec文件。
接下来,修改.spec文件:

将flask程序封装为一个docker容器 flask项目打包成exe_资源文件_06


修改前datas=[],本文这里把它改成上图所示,意思是

将test.py当前目录下的PATH目录(及其目录中的文件)加入目标exe中,在运行时放在临时文件的根目录下,名称为PATH。

到这一步便可以把资源文件嵌入到.exe文件了。
4. 生成.EXE文件以及其他相关文件
接下来,我们便可以放心的生成.exe文件了。执行cmd指令:

pyinstaller -F test.spec

等待一段时间.exe文件生成在子文件dict中。到此便可以把.exe发给其他电脑端运行了。.exe运行比较慢,建议多等待,只要没出现错误提示就OK。

可能会出现No module named 'pkg_resources.py2_warn’错误提示