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

news2024/11/15 10:47:00

说明

相比常规的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_metadata

datas = copy_metadata("streamlit")

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

import streamlit.web.cli as stcli
import os, sys
 
 
def resolve_path(path):
    resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))
    return resolved_path
 
 
if __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_metadata

datas=[("./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 subprocess



WORK_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:
                pass
            shutil.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:
                    pass
                shutil.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.coloradmin.cn/o/2081876.html

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

相关文章

阿里云服务器自带多少DDoS防护?小编为你详细揭秘!

大家好呀!今天小编来聊聊一个很多朋友都关心的问题:阿里云服务器自带多少DDoS防护?随着网络攻击手段的日益猖獗,DDoS攻击对企业业务的威胁越来越大,选择一个安全可靠的云服务器至关重要。阿里云作为国内领先的云计算服…

宝宝自闭症的表现与理解

自闭症,又称孤独症,是一种复杂的神经心理障碍,它影响患儿的脑部发展,并在社交沟通、兴趣和行为上表现出明显的异常。自闭症通常在幼儿期就有所体现,但很多时候,家长在宝宝一岁前后才会开始注意到这些异常表…

排序算法刷题笔记【牛客网】

排序算法刷题笔记【牛客网】 排序算法刷题记录,来自牛客网,主要是有些题目会去搜一下相关知识,这里就用来做笔记,类似错题本了。 会持续更新…… 其实就是把45前面的排好了,然后45从后往前比较。 45前面的排列&#xf…

高级问题解决查询搜索网址

1、世界上最大的技术问答网站,里面问题的种类很多,回答的质量也很高,当你在谷歌等搜索引擎没能得到满意的答案的时候,可以到Stack Overflow上看 2、Reddit是一个全球性的社交新闻网站和讨论平台,用户可以在这里分享、…

grafana可视化 安装及集成zabbix数据源详细教程

目录 grafana简介安装grafana安装示例汉化(选做)启动访问web界面 安装zabbix插件在线安装离线安装启用插件 配置zabbix数据源 grafana简介 Grafana是一个功能强大、灵活性高、易于使用的数据可视化工具,广泛应用于各种领域,包括I…

el-input-number,增加清空icon按钮,输入值居左(左对齐)、去除控制按钮

:controls"false"&#xff0c;不使用控制按钮&#xff1b; <div><span class"label">金额</span><divstyle"width: 100%;border: solid 1px rgba(0, 0, 0, 0.1); border-radius: 4px; display: flex;align-items: center;"…

比裁员更侮辱人的事发生了。。。

在这个快节奏的时代&#xff0c;职场如战场&#xff0c;每个人都在为了生存而奋斗。但你有没有遇到过这样的情况&#xff1a;工作量突然增加&#xff0c;薪水却纹丝不动&#xff1f; 最近某位网友爆料&#xff0c;他们公司裁掉两名员工&#xff0c;一个月薪一万七&#xff0c;…

解决npm下载依赖速度慢的问题

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

CC工具箱使用指南:【DAT转要素类】

一、简介 这是一个将特定的DAT文件批量转换为GDB点要素类的工具。 用记事本打开DAT文件&#xff0c;长这样&#xff1a; 数据比较简单&#xff0c;就是一些点坐标&#xff0c;一行一个点&#xff0c;包括XYZ三个坐标。 二、工具参数介绍 点击【定制2】组里的【DAT文件转要素…

python-译码(赛氪OJ)

[题目描述] 在机器学习中&#xff0c;现在定义一种编码规则&#xff1a;对于长度为 3的字符串&#xff08;均由小写字母组成&#xff09;&#xff0c;首先按照字典序进行排序&#xff0c;即 aaa&#xff0c;aab&#xff0c;aac&#xff0c;…&#xff0c;zzz。 将这些字符串按照…

合宙LuatOS开发板使用手册——Air700EAQ

EVB-Air700EL&700EY 开发板是合宙通信推出的基于 Air700EL&700EY 模组所开发的&#xff0c; 包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;PCB 天线等必要功能的最小硬件系统。 以方便用户在设计前期对 模块进 行性能评估&#xff0c;功能调试&#xff0c;软…

知识图谱——语义知识库的开端(1)

从最初的 Google 搜索&#xff0c;到如今的聊天机器人、大数据风控、证券投资、智能医疗、自适应教育、推荐系统等各个领域&#xff0c;知识图谱的应用无处不在。知识图谱&#xff08;Knowledge Graph&#xff09;的概念由 Google 在 2012 年正式提出&#xff0c;旨在打造更智能…

2024最新VSCode实用插件推荐,开发效率遥遥领先!超全面,快收藏~

大家好&#xff0c;我是石小石&#xff01;作为前端开发&#xff0c;vscode好比我们的衣食父母&#xff0c;不可或缺。我相信大家都试过给编译器装一些插件&#xff0c;用来提升开发效率。 这篇文章&#xff0c;我将结合自己的工作经验&#xff0c;向大家推荐我工作中用到的一…

【C++第十三课-二叉树进阶】二叉搜索树

目录 二叉搜索树概念增&#xff0c;删&#xff0c;查1、删2、查3、增 拷贝构造析构函数赋值增&#xff0c;删&#xff0c;查&#xff08;递归&#xff09;1、增&#xff08;递归&#xff09;2、删3、查 k搜索模型kv搜索模型 二叉搜索树 概念 二叉搜索树又称二叉排序树&#x…

创建微服务组件

1.1 数据库表 shop_order订单表 shop_product商品表 shop_user⽤户表 1.2 服务模块 1.2.1 创建模块 创建公共⽗模块springcloud_alibaba 创建公共模块 shop_common ,⽤于存放公共的实体类和⼯具类 创建订单微服务模块 shop_order 端⼝809X 创建商品微服务模块 shop_product …

同鑫eHR人力资源管理系统 GetFlowDropDownListItems SQL注入漏洞复现

0x01 产品简介 同鑫eHR,聚焦人力资源管理痛点,首创提出人力资源管理系统一体化概念,打造应用一体化、数据一体化、流程一体化、终端一体化的人力资源管理系统一体化解决方案。为广大企业解决系统功能分散不同步、业务数据零散无价值、流程可自定义程度低、行业深度问题无法…

【ceph学习】ceph如何进行数据的读写(1)

版本 ceph版本为17. ceph如何进行读写接口的实现 Ceph的客户端通过librados的接口进行集群的访问&#xff0c;这里的访问包括&#xff1a; 1&#xff09;对集群的整体访问 2&#xff09;对象的访问 两类接口&#xff0c;这套接口&#xff08;API&#xff09;包括C、C和Pytho…

在读本科生可以考PMP吗?

PMP认证与学历无关&#xff0c;但在报考条件上需要留意以下几点&#xff1a; 学历要求&#xff1a;年满23周岁/高中毕业5年以上/ 大专毕业3年以上&#xff0c;只需满足其中一个条件即可&#xff1b; 证明要求&#xff1a;必须具备35学时&#xff08;PDU&#xff09;证明&…

值得收藏 猫咪浮毛异味难清理?三种有效的除毛工具来帮你

养猫一时爽&#xff0c;除毛火葬场&#xff01;我接老大布偶回家以来&#xff0c;都没怎么掉毛&#xff0c;还挺开心的。然后觉得可以负担得起第二只小猫&#xff0c;就养多一只老二银渐层。结果没接回来多久&#xff0c;我的”报应“来了...遇上换毛季&#xff0c;两只猫像是觉…

操作系统识别——CSP-J1真题讲解

【题目】 以下哪个不是操作系统?( ) A. Linux B. Windows C. Android D. HTML 【答案】 D 【解析】 操作系统&#xff08;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;相当于电脑的管家&#xff0c;管理着计算机的硬件与软件资源&#xff0c;以供电…