PyScript 中如何安全加载外部文件到虚拟文件系统

7次阅读

PyScript 中如何安全加载外部文件到虚拟文件系统

PyScript 无法直接读取本地文件,但可通过 py-config 的 files 配置项将远程或本地托管的文件预加载至内置虚拟文件系统,使 open() 等标准 I/O 函数正常工作。

pyscript 无法直接读取本地文件,但可通过 `py-config` 的 `files` 配置项将远程或本地托管的文件预加载至内置虚拟文件系统,使 `open()` 等标准 i/o 函数正常工作。

在 PyScript 环境中,由于浏览器沙箱安全策略限制,Python 代码无法直接访问用户设备上的本地文件系统(例如调用 open(‘data.txt’) 会触发 FileNotFoundError)。但这并不意味着文件操作不可行——PyScript 提供了基于内存的虚拟文件系统(Virtual File System, VFS),允许你在运行前将所需文件“注入”其中,从而让标准 Python 文件 API(如 open()、os.listdir()、pathlib.Path.read_text())无缝工作。

✅ 推荐方式:使用 的 files 配置项

这是当前(PyScript ≥ 2024.2.1)官方推荐、简洁且可靠的方案。你只需在 中声明一个 files 列表,每个条目指定文件 URL 和目标路径(相对于 / 根目录):

<py-config> {   "files": [     {"src": "/data/config.json", "name": "config.json"},     {"src": "/assets/input.csv", "name": "data/input.csv"},     {"src": "https://example.com/model.pkl", "name": "models/weights.pkl"}   ] } </py-config>  <py-script> # 此时文件已存在于虚拟文件系统中 with open("config.json", "r") as f:     config = f.read()     print("Loaded config:", config)  from pathlib import Path csv_path = Path("data/input.csv") if csv_path.exists():     print("CSV size:", csv_path.stat().st_size, "bytes") </py-script>

? 关键说明

  • src 必须是同源 URL(即与当前 HTML 页面同域),或支持 CORS 的跨域资源;
  • name 是该文件在虚拟文件系统中的目标路径,支持子目录(如 “data/input.csv”);
  • 所有文件会在 PyScript 初始化阶段自动下载并挂载,无需手动等待;
  • 加载完成后,open()、pathlib、csv、json 等模块均可直接使用,行为与本地 Python 完全一致。

⚠️ 注意事项与最佳实践

  • 本地开发调试?请启动 HTTP 服务
    浏览器禁止 file:// 协议下的跨源请求,因此切勿双击 HTML 文件打开。务必使用本地服务器,例如:

    # Python 内置服务器(端口 8000) python3 -m http.server 8000 # 然后访问 http://localhost:8000/your-app.html

    或使用 Live Server(VS Code 插件)、npx serve 等工具。

  • 避免使用已弃用的 [[fetch]]
    虽然旧版文档提及 [[fetch]] 配置,但它语法复杂、错误处理不直观,且在新版中已被标记为 legacy。files 更语义清晰、容错更强,是唯一推荐路径。

  • 大文件与性能提示
    虚拟文件系统完全驻留在内存中,因此单个文件建议控制在几十 MB 以内;超大文件应考虑流式处理(如通过 fetch() + Response.arrayBuffer() + pyodide 的 pyodide.ffi.to_js() 手动桥接,但已超出基础 files 范畴)。

  • 路径区分大小写 & 根目录为 /
    虚拟文件系统的路径规则与 unix 一致:”MyFile.txt” 和 “myfile.txt” 是两个不同文件;所有 name 均以 / 为根,但书写时省略前导 /(即 “data/log.txt” 对应 /data/log.txt)。

✅ 总结

只要将文件部署在可访问的 HTTP 服务下,并通过 的 files 正确声明,PyScript 就能为你构建一个功能完备的虚拟文件系统。从此,你的算法可以像在本地 Python 环境中一样自然地使用 open()、读取配置、加载数据集或序列化模型——安全、简洁、开箱即用。

text=ZqhQzanResources