使用PyScript的pyodide-worker选项时,如何正确引入根目录文件?
解决Pyodide-Worker模式下加载本地数据文件的问题
当切换到pyodide-worker模式时,原pyscript模式下的<py-config> [[fetch]]配置无法直接生效——因为该模式下Pyodide运行在独立的Web Worker线程中,需要通过以下方式加载本地数据文件:
方案1:使用Pyodide内置API直接读取文件
在Python代码中,利用pyodide.http.open_url读取本地文件内容,既可以直接处理内容,也可以写入Pyodide的虚拟文件系统供后续代码调用:
import pyodide.http import pandas as pd from io import StringIO # 方式1:直接读取内容并加载为DataFrame csv_content = pyodide.http.open_url('./data.csv').read() df = pd.read_csv(StringIO(csv_content)) # 方式2:写入虚拟文件系统,让后续代码可以通过路径访问 with open('data.csv', 'w') as f: f.write(csv_content) # 后续代码即可正常使用 pd.read_csv('data.csv')
方案2:通过JavaScript预加载文件后传递给Pyodide
先在HTML中用JavaScript提前获取文件内容,再传递到Pyodide的全局环境中:
- 在HTML的
<body>中添加以下脚本:
<script> // 标记Pyodide初始化完成 window.pyodideReady = new Promise(resolve => { document.addEventListener('pyodide:ready', () => resolve()); }); // 加载本地数据文件 fetch('./data.csv') .then(res => res.text()) .then(data => { window.pyodideReady.then(() => { // 将数据传入Pyodide全局变量 pyodide.globals.set('csv_raw_data', data); }); }); </script>
- 在Python代码中读取全局变量并处理:
import pandas as pd from io import StringIO df = pd.read_csv(StringIO(csv_raw_data))
关键注意事项
- 确保
data.csv与生成的.html、.js文件处于同一目录,且通过HTTP服务器(如python -m http.server)访问,不要直接用file://协议打开(浏览器跨域限制会导致文件加载失败)。 - 打包分享时,需将所有相关文件(HTML、JS、数据文件)放入压缩包,接收方解压后启动本地HTTP服务器即可查看。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

