将Streamlit应用打包成可执行文件

1.要将Streamlit应用打包成可执行文件(exe),可以使用PyInstaller工具。以下是具体步骤:

安装必要的库

首先,确保安装了Streamlit和PyInstaller:

pip install streamlit pyinstaller
创建Streamlit应用

编写一个简单的Streamlit应用,例如app.py:

import streamlit as st

st.title("我的超棒应用")
x = st.slider("x")
st.write(x, "的平方是", x * x)
创建打包脚本

在项目根目录下创建一个名为run_app.py的文件,内容如下:

import streamlit.web.cli as stcli
import os
import sys

if __name__ == "__main__":
    # PyInstaller onefile 模式下的解压临时目录
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))

    # 切换工作目录到真正的程序根目录
    os.chdir(os.path.dirname(os.path.abspath(__file__)))

    # 这里的 streamlit app 是什么名字,需要修改下,我的这里叫main.py
    app_path = os.path.join(base_path, "myapp.py")

    # 确保工作目录正确
    if not os.path.exists(app_path):
        print("找不到 myapp.py:", app_path)
        sys.exit(1)

    sys.argv = [
        "streamlit",
        "run",
        app_path,
        "--global.developmentMode=false",
    ]
    sys.exit(stcli.main())

创建hooks文件夹和hook-streamlit.py文件

在项目根目录下创建一个名为hooks的文件夹,并在其中创建一个名为hook-streamlit.py的文件,内容如下:

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata("streamlit")

第一次打包

运行以下命令进行第一次打包:

pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean
修改spec文件并进行第二次打包

打开生成的run_app.spec文件,添加以下内容:

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

datas = [(r"D:\auto_test\.venv\Lib\site-packages\streamlit\runtime","./streamlit/runtime")]
datas += collect_data_files("streamlit")
datas += copy_metadata("streamlit")

# 把你的项目打包进去
datas += [('./myapp.py', '.')]

a.datas = datas或者
datas=datas,
noarchive=False,

然后运行以下命令进行第二次打包:

pyinstaller run_app.spec --clean

这样就会在dist文件夹下生成一个可执行文件run_app.exe

通过以上步骤,你可以将Streamlit应用成功打包成exe文件,并在其他电脑上运行。

参考网站
https://juejin.cn/post/7537711310579318784
https://blog.csdn.net/weixin_46277779/article/details/144629460

Streamlit 打包后无法运行的解决方法
1
2
3
当使用 PyInstaller 将 Streamlit 应用打包为可执行文件后,可能会遇到无法运行的问题。这通常是由于依赖未正确打包或路径配置错误导致的。以下是解决此问题的步骤。

示例问题

运行 exe 文件时提示错误:找不到 main.py 或依赖模块。
复制
解决步骤

  1. 创建运行入口文件

Streamlit 应用需要通过命令 streamlit run 启动,因此需要创建一个入口文件(如 run_app.py),以便正确调用 Streamlit。

示例代码:

import streamlit.web.cli as stcli
import sys
import os

if __name__ == "__main__":
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
os.chdir(os.path.dirname(os.path.abspath(__file__)))
app_path = os.path.join(base_path, "main.py")

if not os.path.exists(app_path):
print("找不到 main.py:", app_path)
sys.exit(1)

sys.argv = ["streamlit", "run", app_path, "--global.developmentMode=false"]
sys.exit(stcli.main())

复制
2. 创建 Hook 文件

在项目根目录下创建 hooks 文件夹,并添加 hook-streamlit.py 文件,用于确保 Streamlit 的依赖被正确打包。

示例代码:

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata('streamlit')

复制
3. 使用 PyInstaller 打包

首次运行以下命令生成 .spec 文件:

pyinstaller --onefile --additional-hooks-dir=./hooks run_app.py --clean
复制
然后修改生成的 .spec 文件,确保依赖和路径正确。

关键修改:

from PyInstaller.utils.hooks import collect_data_files, copy_metadata

datas = collect_data_files("streamlit")
datas += copy_metadata("streamlit")
datas += [('./main.py', '.'), ('./config.py', '.'), ('./pages', 'pages')]

a = Analysis(
['run_app.py'],
pathex=[],
binaries=[],
datas=datas,
hiddenimports=[],
hookspath=['./hooks'],
)

复制
完成修改后,重新运行以下命令进行打包:

pyinstaller run_app.spec --clean
复制
4. 检查依赖和路径

将 main.py 和其他必要文件(如 .streamlit/config.toml)复制到生成的 dist 文件夹中,确保所有依赖文件都在正确的位置。

  1. 测试运行

双击生成的 .exe 文件,确认应用能够正常启动。如果仍有问题,请检查日志并确保所有依赖已正确安装和打包。

通过以上步骤,可以有效解决 Streamlit 打包后无法运行的问题

posted @ 2025-11-17 16:57  赏金猎人小熊  阅读(94)  评论(0)    收藏  举报