Streamlit应用打包发布

简介: 搞事情还是非常累的,那么这里的话就简单更新一下使用实用一点的文章。这也是在实际过程当中遇到了很多问题,最终才解决之后的一篇经验文吧。打包准备这里我使用到的打包软件还是Pyinstaller ,通过这个来对其进行打包,软件本体大概是长这个样子:

搞事情还是非常累的,那么这里的话就简单更新一下使用实用一点的文章。这也是在实际过程当中遇到了很多问题,最终才解决之后的一篇经验文吧。

打包准备

这里我使用到的打包软件还是Pyinstaller ,通过这个来对其进行打包,软件本体大概是长这个样子:

1718264448671.jpg

这是一个视频编辑器,页面是使用streamlit来进行编写的(当然也后悔了,早知道直接使用qt或者vue来写的)那么众所周知,streamlit写出来的界面本身是需要这个玩意来独立启动的。因此打包的时候有很多细节。

载入streamlit

这里我们需要单独指定一下streamlit。这里我们需要编写一下hook,让pyinstaller来处理。

1718264488860.jpg

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata("streamlit")

创建启动脚本

这里我们的程序入口虽然是main.py 但是,由于我们需要

streamlit run main.py

才能启动,所以的话我们只能写一个运行脚本。之后对这个脚本进行打包,得到执行文件。 之后打包之后,需要将这个文件放到打包好 的执行文件的同级目录下

"""
@FileName:run_app.py.py
@Author:Huterox
@Description:Go For It
@Time:2024/6/11 11:42
@Copyright:©2018-2024 awesome!
"""

from main import *

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("main.py"),
        "--global.developmentMode=false",
    ]
    sys.exit(stcli.main())

创建指令

之后的话,我们需要来创建我们的指令: 这里我展示一下我的指令:

pyinstaller --add-data ".streamlit:.streamlit" --add-data "resource:resource" --add-data "doc:doc" --add-data "assert:assert" --additional-hooks-dir=./hooks  --icon=tubiao.ico run_app.py

当然实际上,我们之所以使用这个指令的目的还是为了生成spec文件,你当然可以直接创建这个文件。下面是我的参考文件。

# -*- mode: python ; coding: utf-8 -*-

from PyInstaller.utils.hooks import collect_data_files
from PyInstaller.utils.hooks import copy_metadata

datas = [("C:/Anaconda3/envs/MixedVideo/Lib/site-packages/streamlit/runtime","./streamlit/runtime"),('.streamlit', '.streamlit'), ('resource', 'resource'), ('doc', 'doc'), ('assert', 'assert')]
datas += collect_data_files("streamlit")
datas += copy_metadata("streamlit")


block_cipher = None


a = Analysis(
    ['run_app.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=[],
    hookspath=['./hooks'],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='run_app',
    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,
    icon=['tubiao.ico'],
)
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='run_app',
)

你可以直接按照这个来进行修改。之后

pyinstaller your_spec.spec --clean

这样一来就可以完成打包了,但是这里有几个点需要特别注意:

Q&A

虽然通过上面的方法我们可以打包好我们的程序,但是这里还是有很多问题。这里我遇到的,包括我查找相关资料的时候看到的最多的问题就是,关于依赖的问题。

依赖未找到

这里原因其实就只有一个,那就是Pyinstaller打包的时候,没有找到依赖,我们来看到这个代码。

from main import *
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("main.py"),
        "--global.developmentMode=false",
    ]
    sys.exit(stcli.main())

我在这里特意:

from main import *

其目的就是为了,让Pyinstaller知道,我导入了先前程序的main文件,之后去解析里面的依赖然后自动打包。这样就解决了依赖问题,注意哪怕是你自己写的包,他也会自动解析的。如果没有,只有两个问题:

  1. 你的Python包没有 __init__.py
  2. 缺少某些dll,依赖模型(因为我这个是深度学习项目,有一些特殊格式的文件是不会被自动打包进去的)

那么解决办法很简单:

  1. 加入初始化文件
  2. 填写模块名字(第三方或自己的包名)

1718264641062.jpg

  1. 缺少某些媒体,资源文件,那就直接找打对应文件copy过去就好了。以我的程序为例,有3G的模型文件不会自动打包进去的,只能自己手动导入。
相关文章
|
7月前
|
缓存 前端开发 JavaScript
flask各种版本的项目,终端命令运行方式的实现
flask各种版本的项目,终端命令运行方式的实现
331 4
|
6月前
|
Linux C语言 iOS开发
Pyinstaller简单使用说明
PyInstaller是一个Python库,可以将Python应用程序转换为独立的可执行文件。PyInstaller支持跨平台,可以在Windows、Linux和MacOS上生成可执行文件。PyInstaller会分析Python程序,并将程序打包成一个完整的可执行文件,包括所有依赖项。此外,PyInstaller可以自动检测Python依赖库,并将其打包到可执行文件中。如果PyInstaller提供的默认打包选项不能满足你的需求,你可以通过spec文件来自定义打包选项。
101 2
|
6月前
|
Python
python项目依赖库打包发布方法
python项目依赖库打包发布方法
|
6月前
|
机器学习/深度学习 缓存 数据可视化
Streamlit入门指南
Streamlit是Python库,用于创建交互式数据科学和机器学习Web应用。它简化了定制Web应用的创建,提供内置小部件和工具进行数据展示、用户输入处理和自定义可视化。快速入门涉及安装Streamlit、导入库、定义应用并使用`streamlit run`命令运行。示例代码展示了如何创建一个显示滑块和正弦图的应用。最佳实践包括组织代码、利用缓存、优化布局以及使用内置功能。Streamlit Gallery提供了更多应用示例,如文本生成器和图像分类器。
588 0
|
小程序 IDE 安全
UniAPP HBuilderX 运行到各个小程序开发工具
UniAPP HBuilderX 运行到各个小程序开发工具
570 0
|
安全 编译器 Python
python安装使用Flask框架(Vscode)
python安装使用Flask框架(Vscode)
225 0
|
机器学习/深度学习 数据可视化 前端开发
Streamlit初识(一)——安装以及初步应用
Streamlit初识(一)——安装以及初步应用
1768 0
|
数据可视化 区块链
如何使用nsis打包electron开发的安装程序
如何使用nsis打包electron开发的安装程序
如何使用nsis打包electron开发的安装程序
|
Apache 网络架构 Python
|
API iOS开发 开发者
Xcode自动打包和上传蒲公英平台脚本(用python实现)
工作中,特别是所做项目进入测试阶段,肯定会经常打 Ad-hoc 包给测试人员进行测试,但是我们肯定不想每次进行打包的时候都要进行一些工程的设置修改,以及一系列的 next 按钮点击操作,现在就让这些操作都交给脚本化吧!
377 0