如何通过点击其他文件中的链接运行Python脚本(Streamlit/Flask)
解决Streamlit页面点击链接无内容、端口变化问题
问题分析
- 脚本文件名错误:你提供的脚本后缀是
.py1(script1.py1、第二个script1.py1),但代码中调用的是.py后缀文件,导致Streamlit找不到目标脚本,自然无内容显示。 - 冗余且错误的Flask使用:完全不需要用Flask实现需求——点击链接直接启动并跳转Streamlit脚本即可。原代码生成的链接指向Flask端口,但Flask仅提供触发脚本的路由,没有页面内容,访问后自然无显示。
- 重复启动服务引发端口混乱:每次点击按钮都会启动新的Flask线程,且Streamlit默认会自动选择未被占用的端口(8501被占就用8502,以此类推),导致端口持续变化。
- Streamlit按钮逻辑漏洞:Streamlit每次交互都会重新运行整个脚本,原代码重复启动线程会造成资源浪费和端口冲突。
修正后的实现方案
步骤1:修正脚本文件名
将script1.py1重命名为script1.py,第二个script1.py1重命名为script2.py,确保文件名与代码调用一致。
步骤2:简化main.py代码
去掉不必要的Flask依赖,直接通过指定端口启动Streamlit脚本,并用会话状态避免重复启动:
import streamlit as st import subprocess import os # 定义脚本与对应端口的映射 scripts = { "Script 1": {"file": "script1.py", "port": 8502}, "Script 2": {"file": "script2.py", "port": 8503}, } # 初始化会话状态,记录脚本是否已启动 if "started_scripts" not in st.session_state: st.session_state.started_scripts = set() # 生成每个脚本的启动按钮和跳转链接 for name, info in scripts.items(): script_file = info["file"] port = info["port"] script_url = f"http://localhost:{port}" # 未启动时显示启动按钮 if name not in st.session_state.started_scripts: if st.button(f"启动 {name}"): # 指定端口启动Streamlit,避免自动换端口 subprocess.Popen( ["streamlit", "run", script_file, "--server.port", str(port)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True if os.name == "nt" else False ) st.session_state.started_scripts.add(name) st.success(f"{name} 已启动,点击下方链接打开") # 已启动时显示跳转链接 if name in st.session_state.started_scripts: st.markdown(f'<a href="{script_url}" target="_blank">打开 {name}</a>', unsafe_allow_html=True)
步骤3:脚本文件内容
script1.py:
import streamlit as st st.write("Inside script1.py")
script2.py:
import streamlit as st st.write("Inside script2.py")
修正后的优势
- 手动指定Streamlit端口,避免端口自动变化,链接固定可靠。
- 用会话状态记录已启动脚本,避免重复启动服务造成资源浪费。
- 去掉冗余的Flask依赖,逻辑更简洁,完全匹配需求场景。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

