You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,无需保存到本地:

  • 步骤:
    1. 在requirements.txt中添加pdfkit,Streamlit托管环境需额外安装wkhtmltopdf(可在启动脚本中加入sudo apt-get install wkhtmltopdf)
    2. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:43:52