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

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

准备好要打包的flask项目,如下图run.py文件的代码

导入打包函数库pyinstaller

python 复制代码
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文件设置一个自定义的图标

推荐执行

python 复制代码
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,可以看到如下

java 复制代码
# -*- 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',因为要覆盖之前打包失败的文件)

java 复制代码
pyinstaller run.spec

之后的操作跟之前一样,双击run.exe来看看程序能不能顺利启动,如果还会闪退黑框框,那么就再执行上面的操作来找到报错原因,直到最后能顺利的启动项目。

最后一步,使用nsis把文件夹打包成windows的安装包

进入官网https://nsis.sourceforge.io/Download进行下载,这里建议使用外网下载。

之后傻瓜式安装。

点击进入这里,在此之前,要将之前项目中的dist/run下的所有文件压缩成run.zip,随后在这里加载刚才的run.zip,并点击Generate后可以了(点击之后会进入新的界面,这个界面会卡很久很久,一定要耐心等待,完成后会在dist文件夹下出现一个run软件,把这个发送给别人安装就可以顺利执行了)

相关推荐
apocelipes10 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户83562907805112 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent17 小时前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m62520 小时前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python
SelectDB2 天前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
荣码2 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵2 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li2 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸3 天前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学3 天前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员