python项目打包exe运行

​ 写好python每次只能在自己电脑上运行,没办法拷贝直接在别的电脑上运行(需要python环境+重新下载依赖)。

​ 为了方便自己花了一会研究怎么把python项目打包为exe(我的项目有多目录,依赖py,图片,数据文件等),不是网上只打包一个py文件为exe

一 项目目录结构

|—- src 项目源码文件夹

​ |—- commons 项目公共工具类

​ |—- CommonsException.py 项目定义异常处理

​ |—- Constant.py 项目常量定义类

​ |—- GetCOVIDData.py 疫情数据爬虫接口

​ |—- GetJournalism.py 新闻内容爬虫接口

​ |—- SaveFile.py 保存爬虫数据到本地接口

​ |—- draw 项目所有绘图接口

​ |—- DistrictChart.py 绘制区域地区数据统计柱状图

​ |—- DramMapByRegion.py 绘制地区疫情统计地图

​ |—- DrawRegionalComparisonHistogram.py 绘制地区对比柱状图

​ |—- StatisticalHighFrequencyWord.py 绘制新闻高频词云

​ |—- file 项目爬虫或数据分析保存的数据文件

​ |—- csv 保存csv数据文件

​ |—- img 项目需要的img,ico

​ |—- map 地图文件

​ |—- txt txt数据文件

​ |—- WindowControl.py 项目运行入口

二 安装打包依赖工具

前提:有python3环境

如果没有需要先下载安装python参考: https://www.python.org/downloads/

2.1 pip安装

1
pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple/

输入安装命令后等待一会即可安装成功当看到dos窗口最后显示successfull 就安装成功

三 打包前先配置打包环境

3.1 生成打包配置文件

1
pyi-makespec -w 项目入口文件.py

说明: 我在项目启动文件下运行的命令,所以 -w 项目入口文件.py 是相对路径

也可以根据自己项目特点用绝对路径也可以

在入口文件所在目录dos路径下 输入上面的命令就可以得到项目打包的运行文件如下图

image-20210102153048882

3.2 编辑配置(自定义)

①默认配置结构

image-20210102153650735

②修改自己需要的配置

添加自己项目中所有的py文件

image-20210102153952519

添加项目需要依赖的第三方库

image-20210102154121924

pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块。

添加自己项目的资源路径(image,txt,csv,ico ……)

image-20210102154609969

资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas。

③配置完成后的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

SETUP_DIR = 'C:\\Users\\xx-xx\\Desktop\\reptile\\src\\file\\'
a = Analysis(['C:/Users/xx-xx/Desktop/reptile/src/WindowControl.py',
'C:/Users/xx-xx/Desktop/reptile/src/commons/CommonsException.py',
'C:/Users/xx-xx/Desktop/reptile/src/commons/Constant.py',
'C:/Users/xx-xx/Desktop/reptile/src/commons/GetCOVIDData.py',
'C:/Users/xx-xx/Desktop/reptile/src/commons/GetJournalism.py',
'C:/Users/xx-xx/Desktop/reptile/src/commons/SaveFile.py',
'C:/Users/xx-xx/Desktop/reptile/src/draw/DistrictChart.py',
'C:/Users/xx-xx/Desktop/reptile/src/draw/DramMapByRegion.py',
'C:/Users/xx-xx/Desktop/reptile/src/draw/DrawRegionalComparisonHistogram.py',
'C:/Users/xx-xx/Desktop/reptile/src/draw/StatisticalHighFrequencyWord.py'],
pathex=['C:\\Users\\xx-xx\\Desktop\\reptile\\src'],
binaries=[],
datas=[(SETUP_DIR, 'file')],
hiddenimports=['os','webbrowser','IPython','frozen','tornado','requests','jieba','beautifulsoup4','lxml','pandas','pyecharts','seaborn','PyQt5'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='WindowControl',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='WindowControl')

四 打包

打包直接运行刚刚的配置文件

1
pyinstaller -D WindowControl.spec

通过命令 pyinstaller -D xxx.spec(直接给个生成的spec文件的绝对路径) 打包成exe安装包。

4.1打包结果

image-20210102155408990

build 目录下为打包临时文件(可删除)

dist 目录为exe运行文件

4.2 运行exe

双击运行,如果项目打包成功可以直接运行成功,如果出现闪退,运行不起参考 五报错处理

五 报错处理

5.1 查看exe报错

需要修改打包配置文件中的 console=True ,修改完成后需要再次打包,这样打包成功运行exe就会提示出现的错误

5.2 打包找不到模块问题

如果依赖的东西模块不全,总会报no modle等错误,需要检查报错什么依赖没有引入,在将对应的依赖包名 添加到打包配置文件中

5.3打包后,一直提示Failed to execute scrpt xxx问题

​ 打包成功,但是没有报任何错误,但是运行exe文件时,总是会提示excute fail的错误,下控制台的报错信息(开启方法参考 5.1),不要去往这钻牛角尖,这时候,你一是先检查打包的路径是不是项目的顶层目录可以加载lib里的其他依赖模块,二是编辑spec文件,将exe单元下的console属性改成True(默认是false)记得保存,然后重新执行以下第二个命令,重新打包exe包之后,在cmd下运行exe执行文件,这时候会出现报错误原因(如果不改spec这个字段内容,无论是双击运行,还是cmd中运行,都只会弹出这个failed to excute的无头脑error,别问头为什么知道,被坑出来的),根据提示来解决具体是缺少依赖模块原因还是代码中读不到非代码资源(txt,png..),如果读不到非代码资源,就根据提示的not found 的路径,手动建立相关目录,放上需要用到的文档资源。

5.4自定义exe图标

需要将软件图标ico放置在 XXXXX.spec 相同目录下,然后运行下面命令打包即可,建议软件图标统一使用ico格式的;如果没有只有png,jpg格式的可以在网上 搜索ico在线转化即可

1
pyinstaller -i -D xxx.ico WindowControl.spec

5.5其它问题

出现什么问题一定要看cmd窗口中的报错信息在依次进行修改