将一个python项目只打包一个可执行文件(*.exe)
本次需求是将一个
python
项目只打包一个exe
(发送给用户时无需提供依赖文件),其内部已经包含了依赖的python
文件和外部的文件如txt
以及环境,本例具体应用是将深度学习模型打包,外部文件为pth格式。
项目的目录文件如下:
main.py
为主函数model.py
为网络结构.pth
是训练好的网络权重:
代码如下,权重文件(外部文件)使用自动获取根目录+相对目录引入:
# 主文件,这里是为main.py
import os
uipath, uiname = os.path.split(os.path.realpath(__file__))
pth_path = os.path.join(uipath, 'net.pth') # 外部文件的绝对路径
my_model = model()
if torch.cuda.is_available():
my_model.cuda()
my_model.load_state_dict(torch.load(pth_path))
else:
my_model.load_state_dict(torch.load(pth_path, map_location='cpu'))
在主函数目录下输入打包命令:
pyinstaller -F --add-data "[PATH];." main.py
参数说明:
-F
生成结果是一个exe
文件,所有的第三方依赖、资源和代码均被打包进该exe
内--add-data
为外部文件或者目录的绝对路径,Windows
中路径需要后面加上;.
[PATH]
为项目路径main.py
为主函数入口
补充
最近遇到打包exe的时候依赖很多数据文件,均在为一个目录(里面很多txt,png等文件)的情况,这种情况操作如下:
- 使用
pyinstaller -F main.py
生成spec和dist和bulid - 编辑spec文件中的datas = [(‘依赖目录绝对路径如D:\data’, ‘data’)], 括号中的第二项为该exe文件解压后存放的目录,我这里代码的数据文件在data下,因此填写data,假如是二级子目录则填写相应的目录名字即可。
- pyinstaller main.spec, 这里无需加-F,有的版本加了-F会报错,该命令会重新生成包含外部依赖的exe文件
- pyinstaller在mac系统中打包的可执行文件为unix类型(exec文件),传给别的mac之后会自动变成文档类型,这时,
chmod +x main
, 恢复文件的可执行之后双击就可以运行了