如何在Streamlit中不落地存储将.py文件转为可嵌入的txt/pdf?
解决Streamlit中无文件保存展示Python代码并管理内存的方案
一、直接用Streamlit内置组件展示代码(无需转换文件)
- 不用转成PDF或TXT,直接读取GitHub仓库的.py文件内容,用
st.code()组件渲染,自带语法高亮,全程内存操作,切换文件时旧内容会被自动替换(Streamlit会话状态会处理内存释放)。 - 示例代码:
import streamlit as st from github import Github # 初始化会话状态变量 if "current_file_content" not in st.session_state: st.session_state["current_file_content"] = "" if "last_selected_file" not in st.session_state: st.session_state["last_selected_file"] = "" # 侧边栏选择文件 selected_file = st.sidebar.selectbox("选择Python文件", ["file1.py", "file2.py"]) # 拉取并更新选中文件的内容 if selected_file != st.session_state["last_selected_file"]: # 替换为实际的GitHub仓库拉取逻辑 g = Github("你的GitHub token") repo = g.get_repo("目标仓库的用户名/仓库名") file_obj = repo.get_contents(selected_file) st.session_state["current_file_content"] = file_obj.decoded_content.decode("utf-8") st.session_state["last_selected_file"] = selected_file # 展示代码 st.code(st.session_state["current_file_content"], language="python")
- 优势:无临时文件生成,内存自动管理,代码阅读体验优于PDF,操作简单。
二、模拟PDF样式的代码展示(仍无需保存文件)
如果需要更接近PDF的排版效果,可通过Markdown或第三方组件实现:
- 用Markdown渲染带高亮的代码块:
code_markdown = f"```python\n{st.session_state['current_file_content']}\n```" st.markdown(code_markdown, unsafe_allow_html=True)
- 用
streamlit-code-editor组件实现更丰富的展示(如行号、代码折叠):
from streamlit_code_editor import code_editor editor_output = code_editor(st.session_state["current_file_content"], language="python")
三、内存中生成PDF的替代方案(无本地文件)
如果一定要PDF格式,可通过pdfkit直接从代码字符串生成内存中的PDF,无需保存到本地:
- 步骤:
- 在
requirements.txt中添加pdfkit,Streamlit托管环境需额外安装wkhtmltopdf(可在启动脚本中加入sudo apt-get install wkhtmltopdf) - 示例代码:
- 在
import pdfkit # 将代码转为带语法高亮的HTML html_content = f""" <html> <head> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/github.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script> <script>hljs.highlightAll();</script> </head> <body> <pre><code class="language-python">{st.session_state['current_file_content']}</code></pre> </body> </html> """ # 生成内存中的PDF字节流 pdf_bytes = pdfkit.from_string(html_content, False) # 展示PDF st.pdf_viewer(pdf_bytes)
- 内存管理:切换文件时新的
pdf_bytes会覆盖旧变量,Python垃圾回收会自动清理旧的内存数据,无需手动操作。
四、内存管理注意事项
- Streamlit会话状态仅在用户会话期间保存数据,切换文件时更新对应变量即可,旧数据会被自动回收。
- 若仓库文件过大,建议只加载用户提问相关的代码片段,避免占用过多内存。
内容的提问来源于stack exchange,提问作者Raghav Kaul
相关产品推荐
相关产品推荐

