streamlit+wordcloud使用pyinstaller打包遇到的一些坑

说明

相比常规的python程序打包,streamlit应用打包需要额外加一层壳,常规app.py应用运行直接使用

python app.py

就可以运行程序了,但streamlit应用是需要通过streamlit命令来运行

streamlit app.py

所以使用常规的pyinstaller app.py打包是不可行滴。
注:这里就默认大家都把python环境和streamlit环境都安装好了

正确打包姿势

此次操作工作目录结构如下
在这里插入图片描述

1、同workdir下创建一个hooks目录并创建一个hook_app.py(命名可以自定义,只是在打包的时候能找到就行)文件,hook_app.py文件内容如下:

from PyInstaller.utils.hooks import copy_metadatadatas = copy_metadata("streamlit")

2、与app.py文件同级创建一个run_app.py文件,具体内容如下

import streamlit.web.cli as stcli
import os, sysdef resolve_path(path):resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))return resolved_pathif __name__ == "__main__":sys.argv = ["streamlit","run",resolve_path("app.py"),"--global.developmentMode=false",]sys.exit(stcli.main())

3、首次打包

直接通过命令进行首次打包

pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean

执行完后会在run_app.py同级下生成run_app.spec文件,具体内容如下

# -*- mode: python ; coding: utf-8 -*-a = Analysis(['run_app.py'],pathex=[],binaries=[],datas=[('static/*', './static')],hiddenimports=['wordcloud'],hookspath=['./hooks'],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,a.binaries,a.datas,[],name='run_app',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)

到这里首次打包是成功的,但此时生成的exe文件还用不了,别问为啥,问就是有问题,咱继续接着说。

3、二次打包

根据首次打包生成的run_app.spec文件我进行调整,需要将一些环境以及一些所需的静态文件一同打包进去,修改后内容如下所示

# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import copy_metadatadatas=[("./site-packages/altair/vegalite/v5/schema/vega-lite-schema.json","./altair/vegalite/v4/schema/"),("./site-packages/streamlit//static","./streamlit/static"),("./site-packages/streamlit/runtime","./streamlit/runtime"),("./site-packages/wordcloud","./wordcloud"),('./static/*', './static')]
datas+=copy_metadata('streamlit')a = Analysis(['run_app.py'],pathex=[],binaries=[],datas=datas,hiddenimports=['wordcloud'],hookspath=['./hooks'],hooksconfig={},runtime_hooks=[],excludes=[],noarchive=False,
)
pyz = PYZ(a.pure)exe = EXE(pyz,a.scripts,a.binaries,a.datas,[],name='run_app',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)

粗略说明下:这里只是对datas里的内容进行额外处理了,将本地或是指定py环境下的altair、streamlit、wordcloud相关依赖环境打包到exe中
内容修改好后咱直接使用以下命令进行二次打包

pyinstaller run_app.spec --clean

等打包完毕后dist目录下就会生成一个run_app.exe 文件了,这时候不要高兴太早,直接运行也是会有问题滴,这里我们需要把app.py文件复制到生成的run_app.exe所在目录下,如图所示:
在这里插入图片描述
这时候咱再运行run_app.exe,如果你看到了以结果,那么恭喜你,你已经成功了,如果报错了那就请耐心的看看错误信息仔细排查下,或是看看我接下来说的一问题看你是否踩坑了
在这里插入图片描述

遇见问题

1、程序启动报错提示streamlit模块找不到

检查下有没有hook_app.py 文件,以及内容里是否有定义copy_metadata(“streamlit”),如果没有就请加上。加上后重复我以上打包步骤再试试,如果还是提示没有就检查下首次打包后生成的run_app.spec文件有没有正常修改为我提供的实例那样,如果改了就再确定下datas定义里设置的路径是否可用
在这里插入图片描述

2、程序启动后wordclould模块找不到

检查下首次打包生成的run_app.spec文件修改有没有遗漏下图所示的设置
在这里插入图片描述
这里需要把wordcloud模块引入

3、程序启动后词云生成失败,导致页面词云图片为空

这里需要引入一些字体文件,打包好后把字体静态文件放置到与exe程序同级目录下,如下图所示
在这里插入图片描述
在这里插入图片描述
放好了重启exe程序即可验证,效果如下图
在这里插入图片描述
附上一键打包脚本(选择性使用):

import os
import shutil
import subprocessWORK_DIR = os.getcwd()def package():build_path = os.path.join(WORK_DIR,'build')dist_path = os.path.join(WORK_DIR,'dist')if os.path.exists(build_path):shutil.rmtree(build_path)if os.path.exists(dist_path):shutil.rmtree(dist_path)try:# 构建 PyInstaller 命令cmd = ['pyinstaller','--onefile','--hidden-import=wordcloud','--add-data', 'static/*;./static','--additional-hooks-dir=./hooks','run_app.py','--clean']print("首次打包cmd:{}".format(cmd))result = subprocess.run(cmd, capture_output=True, text=True)print("首次打包结果:{}".format(result))if result.returncode == 0:os.remove(os.path.join(WORK_DIR,'run_app.spec'))source_spec = os.path.join(WORK_DIR,'package_app_spec.txt')dest_spec = os.path.join(WORK_DIR,'run_app.spec')with open(dest_spec,'w') as f:passshutil.copy(source_spec, dest_spec)cmd_final = ['pyinstaller','run_app.spec','--clean']final_result = subprocess.run(cmd_final, capture_output=True, text=True)if final_result.returncode == 0:app_path = os.path.join(WORK_DIR,'app.py')dest_app_path = os.path.join(dist_path,'app.py')with open(dest_app_path,'w') as f:passshutil.copy2(app_path,dest_app_path)shutil.copytree(os.path.join(WORK_DIR,'static'),  os.path.join(dist_path,'static'))print("打包成功")else:print("最后打包失败:{}".format(final_result))else:print("首次打包失败:{}".format(result))except Exception as e:print(e)if __name__ == "__main__":package()

如果按照以上步骤依旧解决不了您的问题,滴滴我哈!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术,它通常依赖于云存储服务来实现。在Java中,实现云同步功能通常需要与云服务提供商的API进行交互,如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

秋风送爽,夏意未央|VELO Prevail Revo坐垫,一骑绿动起来吧~

夏末秋初,当第一片落叶缓缓飘落,是时候骑上你的自行车,迎接新的季节啦。带上维乐Prevail Revo坐垫,因为它独树一帜地采用EVA与回收咖啡渣精制而成的轻量发泡提升了减震性能,可以让你的每一次骑行都充满意义。    “…

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎(Unreal Engine)火了黑神话游戏。 往后,会有大批量的公司开始模仿这个赛道! C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎,如虚幻引擎(Unreal Engine)等。以下是对 C 虚拟引…

【virtuoso】INV 原理图+前仿真 + 版图 + 后仿真

采用SMIC工艺,不同工艺版图窗口可能有差异 1. 原理图&前仿真 1.1 绘制原理图 PMOS: NMOS宽长比2:1 PMOS开启导通电阻大一点,这样设置,可以使得阈值电压是VDD/2 按 i,可以插入器件按p,可以放置端口 1.2…

【机器学习】聚类算法的基本概念和实例代码以及局部度量学习的概念和实例代码

引言 聚类算法在许多领域都有广泛的应用,例如数据挖掘、生物信息学、图像处理等。 文章目录 引言一、聚类算法1.1 K-Means算法1.2 DBSCAN算法1.3 层次聚类(Hierarchical Clustering)算法1.4 高斯混合模型(Gaussian Mixture Model&…

Web自动化测试实战--博客系统

🎥 个人主页:Dikz12🔥个人专栏:测试📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.项目效果展示 2.编写web测试用例 3.自动化测试脚本开发 3.1创建空项目 引…

Web-gpt

AJAX AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种用于创建动态网页应用的技术。它允许网页在不重新加载整个页面的情况下,异步地从服务器请求数据,并将这些数据更新到网页上。这提高了用户体验…

大语言模型-GLM-General Language Model Pretraining

一、背景信息: GLM是2020-2021年由智谱AI研究并发布的预训练语言模型。 GLM是一种基于自回归空白填充的通用预训练语言模型。 GLM 通过添加二维位置编码和允许任意顺序预测空白区域,改进了空白填充预训练,在NLU任务上超越了 BERT 和 T5。 GL…

12 对话模型微调2

1 P-Tuning P-Tuning 是在 Prompt-Tuning的基础上,通过新增 LSTM 或 MLP 编码模块来加速模型的收敛; 之前的实验也看到了使用prompt训练速度很慢,那么P-Tuning呢 参数占比: trainable params: 5,267,456 || all params: 1,308,37…

Llamaindex RAG实践

加入xtunert文档作为提示词 让大模型理解xtuner

Python 算法交易实验85 QTV200日常推进-钳制指标与交易量

说明 继续保持思考与尝试 最近挺有意思的,碰到很多技术上的问题,其解决方案都类似“阴阳两仪”的概念。 "阴阳两仪"是中国古代哲学中的一个重要概念,源自《易经》(又称《周易》)。它是对宇宙间最基本对立统一…

Java数据结构(七)——优先级队列与PriorityQueue

文章目录 优先级队列与PriorityQueue堆基本概念和性质建堆堆的插入堆的删除堆的应用 PriorityQueuePriorityQueue的构造方法PriorityQueue的常用方法PriorityQueue的模拟实现 经典TopK问题 优先级队列与PriorityQueue 优先级队列是一种特殊类型的队列,其中元素按照…

audiocraft - 免费文本转音乐、AI音乐生成、AI音乐创作工具,Facebook开源,本地一键整合包下载

AudioCraft 是一个由Facebook Research开发的PyTorch库,专注于深度学习在音频生成领域的研究。这个强大的工具包集成了两个最新的AI音频生成模型:AudioGen和MusicGen,能够产生高质量的声音和音乐。 今天的一键包也包含了 AudioGen 和 MusicG…

java一键生成数据库说明文档html格式

要验收项目了,要写数据库文档,一大堆表太费劲了,直接生成一个吧,本来想用个别人的轮子,网上看了几个,感觉效果不怎么好,自己动手写一个吧。抽空再把字典表补充进去就OK了 先看效果: …

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具,可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及,Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …

最简单监控方案:域名、证书 SSL、服务器全搞定!发送钉钉告警消息

需求 有时候域名太多,时间一长,你会不记得快要续期了服务器太多,需要监控,这应该是刚需证书申请来申请去,自动续签鬼知道会不会出问题 痛点 监控还要安装各种东西,会出岔子,折腾够呛&#xf…

C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了,又一个卷季,不写点东西怎么行呢?辣么,我不准备写那些dalao们都懂得,熟练的,想来想去,最终还是写哈希表吧!提供讲解&题目&代码解析哦! 奉上题目链接…

软件测试——论坛系统测试用例

功能测试 其他测试 测试用例 用例编号 用例描述 优先级 预置条件 操作步骤 测试数据 预期结果 测试结果Bug ID软件版本测试员SNS_User_Register_001注册成功使用合法的数据成功注册一个新账号P11、已打开注册页面 2、准备一个未注册用户信息1、输入用户昵称 2、输入用户名 3、…

【前端开发必备小技巧】前端代码规范Vue篇

文章目录 🟢 前端代码规范🟢 一、前端代码规范Vue篇👉1、Vue编码基础👉1.1、组件规范👉1.2、模板中使用简单的表达式👉1.3、指令都使用缩写形式👉1.4、 标签顺序保持一致👉1.5、必须…

【IEEE独立出版 | 往届快至会后2个月检索】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024,9月27-29)

2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办,延边大学、长春理工大学电子信息工程学院、长春理工大学计算机学院、长春理工大学人工智能学院承办,多…