python代码打包到exe的实现示例
作者:测绘导航小菜鸟
一、背景
交给其他同事用python编写的工具,没安装python就比较麻烦,所以学习如何把python源代码打包,在没有python环境的电脑也可以使用。
二、安装打包工具 Pyinstaller
实际使用的是国内清华源的工具,网速会快一点
pip install Pyinstaller pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源

需要注意,这里若出现 pip不是内部外部指令的提示,说明python安装路径没有设置未系统变量,具体操作为:控制面板-系统设置-高级设置-环境变量-系统变量 添加python的安装路径一般
C:\Users\sherry.peng\AppData\Local\Programs\Python\Python39\Scripts C:\Users\sherry.peng\AppData\Local\Programs\Python\Python39


三、打包命令说明
pyinstaller [参数] your_script.py pyinstaller -F -w -i xxx.ico xxx.py -p x:\...\site_packages
常用参数说明:
| 参数 | 含义 |
|---|---|
| -F 或 --onefile | 将程序打包为 单个 EXE 文件,便于分发。 |
| -D 或 --onedir | 生成一个包含多个依赖文件的目录(默认选项)。 |
| -w 或 --windowed | 不显示控制台窗口(适用于 GUI 程序)。 |
| -c 或 --console | 显示控制台窗口(默认)。 |
| –noconsole | 关闭显示控制台窗口。 |
| -i --icon=mxicon.ico | 添加xxx.ico图标 |
| -p | 添加环境site-packages文件夹绝对路径 |
--add-data="C:\Users\sherry.peng\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyecharts;pyecharts"
1. 单个 .py打包成exe(一般)
Pyinstaller -F xxxxx.py
运行后会生成一个dist文件夹,文件夹内就是需要的exe文件
2.配套其他格式文件打包到exe
pyinstaller -w -F xxx.py -i xxx.ico
2.1 添加图标
pyinstaller -F xxx.py -i xxx.ico Pyinstaller -F xxxxx.py --icon=mxicon.ico
在工程里写一个打包的.py,执行可以得到build 和dist 文件夹,dist文件夹里就只有exe
2.2 取消命令行窗口
pyinstaller -F -w xxx.py -i xxx.ico pyinstaller -F mycode.py --noconsole
2.3 配套其他格式文件(.txt .jpg等等)
方法1:.spec文件
1.pycharm中运行.py后生成同名.spec文件
或者命令行实现:进入项目根目录、运行得到spec文件
cd ...\project (pathex) pyi-makespec xxx.py
2.修改spec文件,添加其他格式文件到 datas
这里面是放非.py文件,这里是以元组的形式,
(“文件夹的绝对路径”,“文件夹名”)
注意这里不是写具体的文件名,而是文件夹。
或者通过参数添加
--add-data="...xxxxxxxxx\pyecharts;pyecharts"

3.执行指令打包.spec
pyinstaller -F -w -i xxx.ico xxx.spec
dist/xxx/xxx.exe
运行后会得到一个dist文件夹,文件夹里面又一个以xxx命名的文件夹,在xxx文件夹里面找到exe即可
方法2: 直接运行dist+data文件夹
将存放了非py文件的data文件移动到文件夹下即可
注意:因为涉及到非py文件,所以在py文件编写的时候,涉及到引用这些非py文件时,需要对文件的根目录进行获取:
一般是先自动获取得到当前exe的根目录dirfile;
然后通过字符串拼接来得到非py文件的具体文件夹:dirfile + “\data\非py文件名”
3. 多个.py打包成exe
方法1: pyinstaller直接运行得到
pyinstaller -w -i data\\fa.ico firstUI_logic.py firstUI.py getFeathers.py nms.py operateUI.py operateUI_logic.py -p D:\softwares_install\Anaconda3\envs\Train\Lib\site-packages
pyinstaller 所有需要打包的py文件 -p 环境site-packages绝对路径
注意:py文件的路径需要以第一个py文件为准
运行后会得到dist,在dist里面的firstUI_logic文件夹中找到exe文件即可
方法2:spec运行得到
sepc同 2.3 所述

要在第一行,也就是a = Analysis([xxx.py’])这里面添加你的所有的.py文件,
注意是所有的而且只能是.py文件,第一个是代码你的入口文件。
另外假如.py文件不是与你的主入口文件main.py文件在同一个目录下,那么该文件要写绝对路径。
4. exe、依赖库打包到文件夹
有些第三方的库不能打包到exe,例如Pyecharts(有的环境目录地址单引号他就一直报错)
Pyinstaller -F HeadingAnalysisTool.py --add-data="C:\Users\sherry.peng\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyecharts;pyecharts" (好像引用库文件没有成功)
一般打包成文件夹,再复制相关库到文件夹,用-D不用-F
Pyinstaller -D HeadingAnalysisTool.py
四、打包命令输入方法
方法1:cmd
文件夹地址栏输入cmd进入命令窗口,输出指令打包py文件,一小会儿,不到1min打包成功,在dist文件夹可见exe




方法2:pychram-terminal
在pychram-terminal输入打包指令


方法3:新建.py
在工程里写一个打包的.py,执行可以得到build 和dist 文件夹,dist文件夹里就只有exe

import os
if __name__ == '__main__':
from PyInstaller.__main__ import run
opts = ['HeadingAnalysis.py', '-w', '-F', '--icon=mxicon.ico']
run(opts)
五、 例如:项目ToolSet
1.一般的.py,没有什么特殊的依赖库,直接打包成单个exe
Pyinstaller -F normal.py
2.有些第三方的库,不能打包到exe。例如,pyecharts。一般是,打包的时候,添加一下依赖库的路径。但是,这个路径没有生效,现在是把pyecharts的依赖库文件夹和exe放到一个目录下就可以了。
Pyinstaller -F normal_pyecharts.py --add-data="C:\Users\sherry.peng\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyecharts;pyecharts"
3.除了.py,还依赖其他库,其他格式文件。例如ToolSet.py要调用其他IMU.exe,为了方便替换,第一次可以打包成文件夹,手动添加依赖库、依赖的其他文件。后续可以直接在文件夹里替换exe。有时候不想要命令行窗口出现,用 --noconsole
Pyinstaller -D ToolSet.py Pyinstaller -F ToolSet.py --noconsole
六、调试
6.1.尽量使用from xxx import xxx,而不是直接import xxx
在编写时,尽量使用from xxx import xxx,而不是直接import xxx,然后通过xxx.xxx来使用。比如from cv2 import imread,和import cv2,前者只是导入了imread,而后者直接复制了cv2,导致后续打包的exe过大
6.2.保留了命令行窗口,可以看到有什么异常进而进行修改
根据以往的经验一般是使用【+移动data文件夹+保留命令行窗口】方法来进行打包,成功率高,且通过命令行来进行exe运行,可以看到有什么异常进而进行修改
pyinstaller -i data\\fa.ico firstUI_logic.py firstUI.py getFeathers.py nms.py operateUI.py operateUI_logic.py -p D:\softwares_install\Anaconda3\envs\Train\Lib\site-packages
注意没有-w,保留了命令行窗口
6.3 ModuleNotFoundError可能缺少相应的pyd文件
有时候可能会出现导入包错误,可能在打包好的文件夹中对应的包位置缺少了相应的pyd文件,比如pyinstaller打包执行exe出现
“ModuleNotFoundError: No module named scipy.spatial.transform._rotation_group”

上述其实就是说明在打包完成的dist文件夹中的文件夹中对应的库中缺少pyd文件,需要补充上
这个是因为打包后的第三方库中缺少了pyd文件
具体的解决方法:
去环境下找到相应的py文件,将py编译成pyd文件,然后将pyd文件复制到dist相应的第三库目录下即可
1.安装easycython库
pip install easycython
test.py
def test():
print("调用成功")
main.py
import test test.test()
test.py文件重命名为:test.pyx
终端运行命令
easycython *.pyx

重命名pyd文件,删除:cp36-win_amd64.

运行代码,调用成功:
python main.py

到此这篇关于python代码打包到exe的实现示例的文章就介绍到这了,更多相关python 打包到exe内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
