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

如何让通过stlite+Electron打包的Streamlit桌面可执行程序实现本地磁盘读写?

如何让通过stlite+Electron打包的Streamlit桌面可执行程序实现本地磁盘读写?

嗨,我明白你遇到的问题了!你之前用os.getcwd()拿不到本地Windows的路径,是因为stlite把Streamlit运行在WebAssembly沙箱里——这个沙箱有自己独立的文件系统,和你的本地Windows磁盘完全是两个空间,所以你之前的代码操作的都是沙箱里的“假目录”,自然在本地找不到啦。

别担心,stlite桌面版(就是你用来打包的@stlite/desktop)专门为Electron应用提供了本地文件系统访问的API,咱们只要换用这个API就能直接操作本地磁盘了,下面给你具体的修改方案:

1. 核心思路:改用stlite专属的文件系统模块

stlite桌面环境内置了stlite.fs模块,它的用法和Python标准库的os、io模块几乎一样,但它操作的是本地真实磁盘,而不是沙箱。另外如果需要获取Electron应用的本地路径(比如你的exe所在目录),还可以用stlite.electron模块调用Electron的原生API。

2. 代码修改示例

先把你的Streamlit代码改成下面这样:

import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
# 导入stlite桌面专属的文件系统和Electron API模块
try:
    import stlite.fs as stfs
    import stlite.electron as ste
    IS_STLITE = True
except ImportError:
    # 兼容普通Streamlit网页环境(可选)
    import os as stfs
    IS_STLITE = False

# 你的原有数据处理代码(比如assign变量的定义)
# ...

with st.form(key='create_prints'):
    submit_button = st.form_submit_button(label='create printable files')

if submit_button:
    if IS_STLITE:
        # 获取Electron应用的本地运行目录(Windows下exe所在的文件夹)
        # 调用Electron的app.getPath方法获取exe路径,再拆分出目录
        exe_path = ste.ipc.invoke("app-get-path", "exe")
        # Windows路径用\分隔,拆分到上一级目录就是exe所在文件夹
        local_app_dir = "\\".join(exe_path.split("\\")[:-1])
        base_path = f"{local_app_dir}/{assign['start_timestamp'].min().strftime('%Y%m%d')}/"
    else:
        # 普通Streamlit环境用原方法
        base_path = f"{stfs.getcwd()}/{assign['start_timestamp'].min().strftime('%Y%m%d')}/"
    
    # 用stfs.makedirs创建本地目录(替代os.makedirs)
    stfs.makedirs(f"{base_path}machines/", exist_ok=True)
    
    # 举个保存Matplotlib图的例子(用stfs.open替代内置open)
    fig, ax = plt.subplots()
    ax.plot([1, 2, 3, 4])
    save_path = f"{base_path}machines/sample_plot.png"
    with stfs.open(save_path, "wb") as f:
        fig.savefig(f)
    plt.close(fig)
    
    st.success(f"文件已保存到本地路径:{save_path}")

3. 关键说明

  • stlite.fs的方法和标准os/io几乎完全兼容:比如stfs.makedirs()、stfs.open()、stfs.listdir()这些,你可以像用标准库一样用它们。
  • ste.ipc.invoke()是用来调用Electron原生API的桥梁:这里用app-get-path获取了exe的路径,你还可以用它调用其他Electron API,比如打开文件选择对话框(show-open-dialog)、保存对话框(show-save-dialog),如果需要更灵活的文件选择可以用这个。
  • 兼容普通环境:加的try-except是为了让你的代码在普通Streamlit网页环境也能跑,如果你只在意桌面版可以去掉这部分。

4. 验证方法

修改完Python代码后,重新执行打包命令:

npm run dump numpy pandas matplotlib
npm run dist

生成新的exe后运行,点击按钮就能在exe所在目录下看到你创建的文件夹和Matplotlib图啦!

备注:内容来源于stack exchange,提问作者amen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:53:04