将python flask项目打包成可以用运行的软件(包含报错解决)

news2025/1/20 7:16:15

将python flask项目打包成可以用运行的软件(包含报错解决)

准备好要打包的flask项目,如下图run.py文件的代码
在这里插入图片描述
导入打包函数库pyinstaller

pip install pyinstaller

执行打包指令,参数如下表所示

命令解释
pyinstaller -F run.py只在dist文件夹中生成一个程序run.exe文件,适用于一个模块没有多依赖.py文件
pyinstaller -D run.py默认选项,除了主程序run.exe外,还会在在dist文件夹中生成很多依赖文件
pyinstaller -C run.py默认选项,只对windows有效,使用控制台
pyinstaller -w run.py只对windows有效,不使用控制台
pyinstaller -p D:\project\run.py设置导入路径
pyinstaller -i D:\run.ico demo.py给生成的demo.exe文件设置一个自定义的图标

推荐执行

pyinstaller -D run.py

如果项目里的引入的函数库很多的话需要执行一段时间
执行成功后会出现build和dist两个文件夹和一个run.spec(这个文件后面会说明用处),并且在dist/run下有一个run.exe,这个就是打包好的flask项目的可执行程序了,但是到这里还没有结束,需要双击run.exe来测试是否打包成功,双击会出现两种情况
①双击后产生如下的黑框框,那么说明打包程序没有问题,可以正常启动,这个时候可以使用api测试软件来测试一下程序是否没有问题。
在这里插入图片描述

②双击后快速弹出了黑框框之后就消失了,说明打包程序有报错,没有办法顺利启动,这个时候就需要去找到报错原因了,
在Terminal中找到run.exe所在的目录,执行run.exe
在这里插入图片描述
比如我这里就是产生了如下报错
在这里插入图片描述
通过看报错原因可以知道代码中少了damageLib.bases.damageState函数库(其他项目也可能会出现 No module named 'xxxxx’的报错,解决办法都是一样的),所以需要到run.spec中来添加这个函数库。
打开run.spec,可以看到如下

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
    ['run.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    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='run',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='run',
)

这里主要是在hiddenimports=[]中添加对应的函数库(如果项目中有需要用到其他文件夹的时候也会报错,那么就在datas=[]中添加就行,示例如下datas=[(“yolo/*”,“yolo”) 意思就是把yolo文件夹打包到程序中)
因为刚才是缺少了damageLib.bases.damageState,那么这里就改成hiddenimports=[“damageLib.bases.damageState”]
这个时候重新打包需要用到的指令如下(在运行过程中需要输入‘y’,因为要覆盖之前打包失败的文件)

pyinstaller run.spec

在这里插入图片描述
之后的操作跟之前一样,双击run.exe来看看程序能不能顺利启动,如果还会闪退黑框框,那么就再执行上面的操作来找到报错原因,直到最后能顺利的启动项目。
最后一步,使用nsis把文件夹打包成windows的安装包
进入官网https://nsis.sourceforge.io/Download进行下载,这里建议使用外网下载。
在这里插入图片描述
之后傻瓜式安装。
在这里插入图片描述
点击进入这里,在此之前,要将之前项目中的dist/run下的所有文件压缩成run.zip,随后在这里加载刚才的run.zip,并点击Generate后可以了(点击之后会进入新的界面,这个界面会卡很久很久,一定要耐心等待,完成后会在dist文件夹下出现一个run软件,把这个发送给别人安装就可以顺利执行了)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装部署k8s集群

系统: CentOS Linux release 7.9.2009 (Core) 准备3台主机 192.168.44.148k8s-master92.168.44.154k8s-worker01192.168.44.155k8s-worker02 3台主机准备工作 关闭防火墙和selinux systemctl disable firewalld --nowsetenforce 0sed -i s/SELINUXenforcing/SELI…

C++模板进阶操作 —— 非类型模板参数、模板的特化

C模板进阶 非类型模板参数模板的特化概念 函数模板特化类模板特化全特化 偏特化模板总结 非类型模板参数 模板参数可分为类型形参和非类型形参。 类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。 非类型形参&#xff1a…

基于springboot智慧外贸平台源码和论文

网络的广泛应用给生活带来了十分的便利。所以把智慧外贸管理与现在网络相结合,利用java技术建设智慧外贸平台,实现智慧外贸的信息化。则对于进一步提高智慧外贸管理发展,丰富智慧外贸管理经验能起到不少的促进作用。 智慧外贸平台能够通过互…

第三百五十三回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容,本章回中将介绍timezone包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

基于Robei EDA--实现串口数据包接收

一、定义串口传输协议帧 控制字的数据大小为一字节,定义帧头为(0xFE 0xDF)帧尾为(0xEF) 模块框图 内模块:串口接收,output:8位data 串口命令:对单字节数据接收进行缓存…

问界M7卖爆了,只因这三点做得好!

文 | AUTO芯球 作者 | 雷歌 理想真是懵了个大圈! 2月第一周的新能源汽车销量榜单已经出来:理想7200台的销量,被华为问界9000辆的销量远远甩在身后。 要知道,1月第四周,理想还以8500辆领先问界的8300辆。 更绝的是&…

算法学习——LeetCode力扣二叉树篇4

算法学习——LeetCode力扣二叉树篇4 222. 完全二叉树的节点个数 222. 完全二叉树的节点个数 - 力扣(LeetCode) 描述 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中&#xf…

深入浅出熟悉OpenAI最新大作Sora文生视频大模型

蠢蠢欲动,惴惴不安,朋友们我又来了,这个春节真的过的是像过山车,Gemini1.5 PRO还没过劲,OpenAI又放大招,人类真的要认输了吗,让我忍不住想要再探究竟,到底是什么让文生视频发生了质的…

C语言—字符数组(3)

可能不是那么的完整,先凑合看吧,如果我学会如何修改以后,我慢慢回来修改的 1.编写程序实现对两个字符串的连接功能; 法一:不使用strcat函数,写程序直接实现,记得添加结束符,不然程序访问数组时候将变得不…

算法基础——单调栈,单调队列

目录 1.单调栈 例题:【模板】单调栈 例题:求和 2.单调队列 例题:滑动窗口 1.单调栈 例题:【模板】单调栈 可以想象出一个柱状图,值越大,这个柱子越高 以此题的样例为例: 第一个数为7,想…

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中,.ma1x0勒索病毒备受人们担忧,因其可将用户的数据文件加密,并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

GIS分析和摄影测量进行屋顶太阳能潜力评估

目前,不可再生的能源资源有限,而减少全球变暖的想法使可再生能源的利用成为当务之急。其中,太阳能作为最清洁、最丰富的可再生能源备受关注。此外,成本的日益降低也使太阳能成为一种极具吸引力的能源。然而,为了从太阳能中获得最大利益,必须考虑各种标准,并选择合适的区…

SG3225EAN规格书

SG3225EAN 晶体振荡器利用先进的锁相环技术和AT切割晶体单元,提供了宽频率范围和高性能LV-PECL输出,73.5 MHz至700 MHz的宽频率范围,能够保证高稳定性和宽频率调整的能力,适应于多样化的应用需求。2.5V和3.3V两种供电电压&#xf…

Spring 用法学习总结(四)之 JdbcTemplate 连接数据库

🐉目录 9 JdbcTemplate 9 JdbcTemplate Spring 框架对 JDBC 进行了封装,使用 JdbcTemplate 方便实现对数据库操作 相关包: 百度网盘链接https://pan.baidu.com/s/1Gw1l6VKc-p4gdqDyD626cg?pwd6666 创建properties配置文件 💥注意…

Stackoverflow(1)-根据RequestBody的内容来区分使用哪个资源

如果使用Spring,可以通过RequestBody将请求体的json转换为Java对象,但如果URI相同,而请求体的内容不同,应该怎么办?问题来源(stackoverflow):Spring RequestBody without using a pojo?稍微研究了一下&…

vue-router 实现路由懒加载

在现代的Web开发中,前端技术的发展日新月异。在构建大规模单页应用(Single Page Application)时,路由管理是一个非常重要的环节。随着用户对网页速度和性能的要求越来越高,有效的路由管理能够显著提升用户体验。本篇博…

torch.utils.data

整体架构 平时使用 pytorch 加载数据时大概是这样的: import numpy as np from torch.utils.data import Dataset, DataLoaderclass ExampleDataset(Dataset):def __init__(self):self.data [1, 2, 3, 4, 5]def __getitem__(self, idx):return self.data[idx]def…

GitKraken Create Repository and Clone不可点击

问题 GitKraken Create Repository and Clone不可点击 详细问题 笔者第一次使用GitKraken,在创建仓库时,填写完成仓库初始化后。发现Create Repository and Clone不可点击。 解决方案 选择Where to clone to位置 产生原因 在创建仓库时&#xff0…

IO 作业 24/2/18

1> 使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char *argv[]) {//定义文件指针FILE *fpNULL;//打开文件&#xff08;只读&#xff09;if((fpfopen("./test.txt",&quo…

机器人内部传感器-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求&#xff0c;可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…