
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)官方推荐、简洁且可靠的方案。你只需在
<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 服务下,并通过










