
PyScript 无法直接运行 Streamlit 应用,因其依赖服务端运行时环境(如 streamlit run 启动的 Web 服务器),而 PyScript 仅在浏览器中通过 Pyodide 执行纯客户端 Python 代码,二者架构不兼容。
pyscript 无法直接运行 streamlit 应用,因其依赖服务端运行时环境(如 `streamlit run` 启动的 web 服务器),而 pyscript 仅在浏览器中通过 pyodide 执行纯客户端 python 代码,二者架构不兼容。
当你在 HTML 中使用 <py-script> 标签尝试加载或运行一个 Streamlit 应用(例如 import streamlit as st 或调用 st.title())时,浏览器控制台必然报错——这不是配置问题,而是底层设计冲突所致。
? 为什么 PyScript + Streamlit 必然失败?
运行环境本质不同:
Streamlit 是一个服务端框架,需 streamlit run app.py 启动一个本地 HTTP 服务器(默认 http://localhost:8501),由 Python 解释器持续管理会话状态(st.session_state)、组件生命周期、前后端通信(WebSocket/HTTP API)等。而 PyScript 是基于 Pyodide 的纯前端方案,它将 CPython 编译为 WebAssembly,在浏览器沙箱中执行 Python 字节码,无进程、无网络服务、无文件系统访问权限。-
关键能力缺失:
- ❌ 无法启动 HTTP 服务(server.address, server.port 无效);
- ❌ 无法持久化 st.session_state(无后端存储与会话同步机制);
- ❌ 不支持 st.file_uploader, st.camera_input 等依赖服务端 I/O 的组件;
- ❌ st.cache_data, st.experimental_memo 等缓存机制失效;
- ❌ 所有 st.* UI 组件在 Pyodide 中无对应 DOM 渲染器,会抛出 AttributeError 或 ImportError(如你截图中的 ModuleNotFoundError: No module named 'streamlit' 或 RuntimeError: st is not available in this context)。
⚠️ 注意:即使你通过 <py-env> 声明安装 streamlit,Pyodide 也无法真正导入——因为 Streamlit 的 __init__.py 内部强依赖 streamlit.web.cli 和 tornado 等服务端模块,这些在浏览器环境中根本不可用。
✅ 正确替代方案:使用 stlite(Streamlit for the Browser)
stlite 是专为浏览器设计的轻量级 Streamlit 兼容运行时,基于 Pyodide 构建,无需后端服务器即可在 <py-script> 或独立 HTML 中运行类 Streamlit 代码。
▶️ 快速上手示例
创建 index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>stlite Demo</title>
<script type="module" src="https://cdn.jsdelivr.net/npm/@stlite/pyodide@v0.23.0/dist/index.js"></script>
</head>
<body>
<div id="stlite-app"></div>
<script type="module">
import { createApp } from "https://cdn.jsdelivr.net/npm/@stlite/pyodide@v0.23.0/dist/index.js";
const app = createApp({
entrypoint: "app.py",
files: {
"app.py": `import streamlit as st
st.title("✅ 运行在浏览器中的 Streamlit!")
x = st.slider("选择数值", 0, 100, 50)
st.write("你选的是:", x)
st.bar_chart([i**2 for i in range(x//10 + 1)])`,
}
});
app.mount(document.getElementById("stlite-app"));
</script>
</body>
</html>✅ 效果:打开 HTML 文件,即可在浏览器中交互式运行类 Streamlit 应用,完全离线、无需 streamlit run。
? 关键限制与注意事项
| 功能 | stlite 支持情况 | 说明 |
|---|---|---|
| st.title, st.slider, st.write 等基础组件 | ✅ 完全支持 | 渲染为标准 HTML/CSS |
| st.session_state | ✅ 有限支持 | 仅当前页面会话有效,刷新即丢失(无服务端持久化) |
| st.file_uploader | ⚠️ 部分支持 | 仅读取浏览器本地文件(不上传到服务器) |
| 自定义 CSS / JS | ✅ 支持 st.markdown(..., unsafe_allow_html=True) | 但无法注入全局 <script> |
| 第三方包(如 pandas, numpy) | ✅ 大部分支持 | Pyodide 已预编译常用科学计算库 |
| st.cache_data | ❌ 不支持 | 浏览器内存有限,建议用普通变量或 lru_cache |
? 给毕业项目的实用建议
- 若项目需离线演示或嵌入网页:优先采用 stlite,打包为单 HTML 文件交付,零部署成本;
- 若需完整 Streamlit 功能(如多用户会话、文件上传保存、数据库连接):必须回归传统部署方式——streamlit run app.py + 本地启动/云服务器托管(如 Streamlit Community Cloud);
- 切勿尝试“魔改” PyScript 加载 Streamlit:既违反安全模型,又无工程可行性,只会浪费宝贵时间。
? 最后提醒:你的错误截图([ERROR])正是 Pyodide 无法解析 Streamlit 模块的典型表现。这不是你代码的问题,而是技术栈不匹配的必然结果。转向 stlite,不是妥协,而是面向浏览器原生场景的正确演进。
现在,打开浏览器,运行上面的 HTML 示例——你会看到第一个真正跑在浏览器里的「Streamlit」,而这,才是你毕业项目稳健落地的技术起点。


















