如何让通过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
相关产品推荐
相关产品推荐

