简介这份资源是面向数据科学家与机器学习工程师的Streamlit入门实践包针对初学者在安装与运行环节常遇到的依赖缺失、版本不兼容、下载缓慢等问题提供一套可直接运行的参考源码。压缩包共4个文件以2个Python脚本为核心分别用于演示应用与安装测试另附requirements.txt依赖清单和.inscode配置文件整体仅4KB轻量易取。已有80人学习下载适合希望快速验证环境、跑通第一个交互式Web应用的入门者。读者可借助可运行源码直接对照安装流程理解环境变量配置与本地服务启动方式并通过测试脚本验证安装是否成功依赖清单与配置文件则便于复现环境、排查库缺失问题为后续将数据分析结果转化为交互式应用打下基础。1. Streamlit 安装运行指南从 pip 到浏览器一个数据脚本怎么变成可交互应用如果你手里有一个已经跑通的 Python 数据处理脚本想把它变成同事能直接点按钮、拖滑块、看图表的小工具Streamlit 是当前最省事的路径之一。它不需要你写前端、不需要懂 HTML/CSS一个app.py加一条streamlit run命令浏览器里就能出现交互界面。但很多人第一次装就卡在环境冲突、端口占用、依赖版本上或者跑起来后每次改代码都要手动重启体验很差。这篇内容面向两类人刚接触 Streamlit、想快速跑通第一个应用的新手以及已经用过但想搞清楚参数配置、缓存机制和部署边界的熟手。我会按「装什么、怎么装、怎么跑、怎么调、坑在哪」的顺序把一条可复现的路径写清楚代码可以直接抄。2. 环境准备与安装为什么推荐 venv 而不是直接 pip install2.1 先确认 Python 版本和 pip 来源Streamlit 对 Python 版本有要求当前主流版本支持 Python 3.8 到 3.12。低于 3.8 会在安装依赖时直接报错高于 3.12 部分二进制依赖可能还没有预编译包。先确认版本python --version # 或 python3 --version如果输出是 3.10 或 3.11基本是最稳的区间。接着确认 pip 来源国内网络环境下默认源可能很慢建议临时指定镜像源安装但不要全局改配置避免影响其他项目pip config list # 查看当前生效的 index-url逻辑说明pip config list会列出所有层级的配置如果看到global.index-url指向某个内网地址而你又不在那个网络里安装就会超时。参数上临时用-i指定源即可不写进配置文件。2.2 用 venv 隔离环境避免和系统包打架直接pip install streamlit最大的问题是会把依赖装进系统 Python和已有的 numpy、pandas 版本冲突。常见做法是每个项目一个虚拟环境# 在项目目录下创建虚拟环境 python -m venv .venv # 激活Linux / macOS source .venv/bin/activate # 激活Windows PowerShell .venv\Scripts\Activate.ps1 # 激活后确认 python 指向虚拟环境 which python # Linux/macOS where python # Windows逻辑说明python -m venv .venv会在当前目录生成一个独立的 Python 运行时里面只有 pip 和 setuptools。激活后所有pip install都只影响这个目录。参数上.venv是目录名可以改成env或venv但建议统一用.venv因为很多编辑器和工具默认识别这个名字。2.3 安装 Streamlit 及常用配套库# 升级 pip避免旧版解析依赖出错 python -m pip install --upgrade pip # 安装 streamlit pip install streamlit # 常用配套数据处理和绘图 pip install pandas numpy matplotlib altair逻辑说明Streamlit 本身依赖 tornado、click、pillow 等安装时会自动拉取。单独装 pandas 和 numpy 是因为绝大多数数据应用都要用提前装好可以避免第一次运行时再等。参数上如果公司内网有私有源把pip install换成pip install -i 私有源地址 streamlit即可。安装完成后验证streamlit --version # 输出类似Streamlit, version 1.x.x如果提示command not found说明虚拟环境没激活或者 Scripts 目录不在 PATH 里。回到激活步骤重新执行。注意不要在系统 Python 里同时装多个版本的 streamlit卸载时用pip uninstall streamlit不要手动删目录否则残留的 entry point 会导致命令找不到。3. 第一个可运行应用从 app.py 到浏览器页面3.1 最小可运行代码结构新建一个目录比如demo_app在里面创建app.py# app.py import streamlit as st import pandas as pd import numpy as np # 页面标题会显示在浏览器标签和页面顶部 st.title(销售数据快速查看) # 侧边栏放控制项 st.sidebar.header(筛选条件) rows st.sidebar.slider(生成数据行数, min_value10, max_value500, value100, step10) # 生成模拟数据 np.random.seed(42) df pd.DataFrame({ 日期: pd.date_range(2024-01-01, periodsrows, freqD), 销售额: np.random.randint(100, 1000, sizerows), 区域: np.random.choice([华东, 华南, 华北], sizerows) }) # 主区域显示表格 st.subheader(原始数据) st.dataframe(df.head(20)) # 简单聚合后画图 st.subheader(按区域汇总) summary df.groupby(区域)[销售额].sum().reset_index() st.bar_chart(summary.set_index(区域))逻辑说明st.title和st.subheader负责页面结构st.sidebar.slider把控件放到左侧栏返回值直接参与数据生成st.dataframe渲染可排序的表格st.bar_chart是内置的快速绘图不需要 matplotlib。参数上slider的min_value、max_value、value、step分别控制范围、默认值和步长改这些就能调整交互粒度。3.2 启动命令和端口参数在app.py所在目录执行streamlit run app.py默认会在http://localhost:8501打开浏览器。如果 8501 被占用或者你想指定端口streamlit run app.py --server.port 8600如果想让同局域网的其他机器访问比如给同事演示streamlit run app.py --server.address 0.0.0.0 --server.port 8600逻辑说明--server.port改监听端口--server.address 0.0.0.0让服务监听所有网卡默认只监听 localhost。参数上0.0.0.0不是具体地址而是「所有可用网卡」的意思配合防火墙放行端口后别人用你的 IP 加端口就能打开。3.3 热重载和运行日志怎么看Streamlit 默认开启文件监听改完app.py保存后页面右上角会出现「Rerun」提示点一下或按R键就重新执行。如果没反应检查启动时有没有加--server.fileWatcherType none这个参数会关掉监听。运行日志直接打在终端里常见的有You can now view your Streamlit app in your browser.表示启动成功Port 8501 is already in use表示端口冲突换端口或杀掉占用进程ModuleNotFoundError: No module named xxx表示依赖没装回到虚拟环境里补装提示改代码后如果页面报错但终端没输出先看浏览器控制台F12有些前端资源加载失败只在浏览器侧报。4. 参数配置与缓存让应用跑得快、不重复计算4.1 配置文件 config.toml 的常用项Streamlit 支持在项目目录下建.streamlit/config.toml把常用参数固化避免每次命令行敲一长串# .streamlit/config.toml [server] port 8600 address 0.0.0.0 maxUploadSize 50 [browser] gatherUsageStats false [theme] base light primaryColor #2e7d32逻辑说明[server]段控制服务行为maxUploadSize单位是 MB默认 200调小可以防止大文件拖垮内存[browser]段的gatherUsageStats设为 false 可以关闭使用数据上报[theme]段改主题色和明暗模式。参数上primaryColor接受十六进制色值改完重启生效。4.2 用 st.cache_data 缓存数据读取每次交互都重新读 CSV 或查数据库页面会明显卡顿。Streamlit 提供缓存装饰器import streamlit as st import pandas as pd st.cache_data(ttl600, show_spinner正在加载数据...) def load_data(path): # 模拟耗时读取 df pd.read_csv(path) return df df load_data(sales.csv) st.dataframe(df)逻辑说明st.cache_data会把函数返回值按参数缓存同样的path第二次调用直接拿缓存不再执行函数体。ttl600表示 600 秒后过期适合数据会更新的场景show_spinner是加载时显示的提示文字。参数上如果函数返回的是数据库连接、文件句柄这类不可序列化对象要用st.cache_resource不要用cache_data。4.3 缓存失效和手动清理缓存不是永久的以下情况会失效参数变化、ttl 到期、手动清理。手动清理在页面右上角菜单里有「Clear cache」选项也可以在代码里调用st.cache_data.clear()逻辑说明这行会清掉当前应用所有cache_data缓存适合在数据源切换后强制刷新。参数上cache_data.clear()不接受参数cache_resource.clear()同理。注意不要在每次 rerun 时无条件调用否则缓存就白做了。注意缓存函数里不要写依赖全局变量的逻辑Streamlit 的缓存键只看函数参数全局变量变了它不知道会出现「数据没更新」的玄学问题。5. 避坑与排查安装运行中最容易翻车的 5 个场景5.1 现象pip install 卡在 Building wheel for xxx原因某些依赖没有预编译 wheelpip 尝试从源码编译而本机缺少编译工具链。解决优先升级 pip 和 setuptools然后指定二进制包pip install --upgrade pip setuptools wheel pip install --only-binary :all: streamlit如果还不行换 Python 3.10 或 3.11这两个版本预编译包最全。5.2 现象streamlit run 报 Address already in use原因8501 端口被其他进程占用常见于上次没正常退出。解决换端口或找到占用进程杀掉# Linux / macOS lsof -i :8501 kill -9 PID # Windows netstat -ano | findstr :8501 taskkill /PID PID /F更省事的做法是在 config.toml 里固定一个不常用的端口。5.3 现象页面一直显示 Running不渲染内容原因脚本里有阻塞操作比如input()、死循环、或者请求了不可达的外部接口。解决检查代码里有没有交互式输入Streamlit 不支持input()外部请求加超时import requests resp requests.get(url, timeout5)参数上timeout单位是秒不设的话可能一直等。5.4 现象改了代码页面没变化原因文件监听没生效或者改的不是正在运行的那个文件。解决确认启动命令里没有--server.fileWatcherType none确认浏览器地址栏的端口和终端一致手动按R或点右上角 Rerun。如果用的是网络文件系统文件监听可能不可靠改成手动刷新。5.5 现象部署到服务器后本地能开、远程打不开原因服务只监听了 localhost或者防火墙没放行。解决启动时加--server.address 0.0.0.0并在服务器安全组或防火墙里放行对应端口。参数上云服务器一般要在控制台的安全组里加规则只放行必要端口不要全开。6. 进阶技巧用 st.form 减少 rerun 和用 session_state 管状态6.1 为什么每次点控件都 rerunStreamlit 的执行模型是「从头到尾重新跑一遍脚本」每个控件交互都会触发一次 rerun。控件少的时候没感觉控件一多每改一个滑块就重新读数据、重新画图体验会碎。st.form可以把多个控件包起来只有点提交按钮才触发一次 rerunimport streamlit as st with st.form(filter_form): st.write(选择筛选条件) region st.selectbox(区域, [华东, 华南, 华北]) min_sales st.number_input(最低销售额, min_value0, value100) submitted st.form_submit_button(应用筛选) if submitted: st.write(f你选择了 {region}最低销售额 {min_sales})逻辑说明st.form内的控件不会单独触发 rerunform_submit_button返回 True 时才执行后续逻辑。参数上st.form的第一个参数是表单唯一标识同一个页面多个表单要取不同名字。6.2 用 session_state 跨 rerun 保存状态因为每次 rerun 变量都会重置想在多次交互间记住用户选择要用st.session_stateimport streamlit as st # 初始化只在第一次运行时执行 if count not in st.session_state: st.session_state.count 0 if st.button(点我加一): st.session_state.count 1 st.write(f当前计数{st.session_state.count})逻辑说明st.session_state是一个类似字典的对象跨 rerun 保留。if count not in st.session_state是标准初始化写法避免每次 rerun 都重置。参数上key 名不要和控件自动生成的 key 冲突自定义 key 建议加前缀。6.3 一个可复用的最小模板把上面几点合起来一个带缓存、表单、状态的最小模板import streamlit as st import pandas as pd st.set_page_config(page_title数据面板, layoutwide) st.cache_data(ttl300) def load(path): return pd.read_csv(path) if region not in st.session_state: st.session_state.region 全部 with st.sidebar: with st.form(f): region st.selectbox(区域, [全部, 华东, 华南, 华北]) ok st.form_submit_button(应用) if ok: st.session_state.region region df load(sales.csv) if st.session_state.region ! 全部: df df[df[区域] st.session_state.region] st.dataframe(df)逻辑说明set_page_config必须放在第一行 Streamlit 调用之前否则报错layoutwide让页面用满宽度表单提交后把选择写进 session_state后续 rerun 读这个值做过滤。参数上ttl300表示缓存 5 分钟数据更新频率高的场景可以调小。我自己的习惯是任何超过两个控件的页面一律用 form 包起来任何需要跨交互记住的值一律进 session_state不靠全局变量。这样页面响应稳定也不会出现「点了没反应」的假象。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?