从内核访问文件和笔记本#

从 JupyterLite 0.1.0b9 开始,用户“文件浏览器”的内容和一些内核(包括 Pyodide 内核)会自动同步。

例如,您可以将文件 file.csv 拖放到 JupyterLite UI 中,然后将其加载到 Python 中

import pandas as pd

data = pd.read_csv('file.csv')

data

文件系统访问的工作原理#

从 JupyterLite 0.4.0 开始,用户“文件浏览器”的内容可以通过两种不同的方式暴露给内核

  1. 通过 Atomics.wait(通过 SharedArrayBuffer)与内核进行同步通信

  2. 通过 Service Worker

1. 通过 Atomics.wait(通过 SharedArrayBuffer)与内核进行同步通信#

默认情况下,如果内核支持,将使用通过 SharedArrayBuffer 进行的同步通信来从内核访问文件。

这种方法应该更健壮,并有助于避免大多数与 Service Worker 和浏览器缓存相关的问题。

但是,它们要求在提供 JupyterLite 应用程序时设置适当的 HTTP 标头

这些标头允许在浏览器中使用 SharedArrayBuffer,此方法用于暴露文件系统内容。

例如,您可以使用以下命令启动本地服务器以启用这些标头

npx static-handler --cors --coop --coep --corp ./

提示

请参阅文档的操作指南部分中的各种部署指南。

注意

以下 Python 内核支持通过 SharedArrayBuffer 访问文件系统

  • jupyterlite-pyodide-kernel

  • jupyterlite-xeus 与 Xeus Python 内核

2. Service Worker#

如果浏览器中没有 SharedArrayBuffer,JupyterLite 将默认回退到使用 Service Worker(直到 JupyterLite 0.4.0 默认使用)。

同步内容的工作原理是挂载一个自定义的 Emscripten 文件系统 (FS),它通过启用 JupyterLite ServiceWorker 与 JupyterLite 内容管理器通信。

注意

根据用户浏览器和 HTTP 服务器的限制ServiceWorker 不会总是启用。

警告

如果这两个组件都没有启用,内核将无法访问和操作文件浏览器中列出的文件。

注意

以下 Python 内核支持通过 Service Worker 访问文件系统

  • jupyterlite-pyodide-kernel

  • jupyterlite-xeus 与 Xeus Python 内核

验证文件系统#

要检查文件系统同步是否启用,请查看 cwd 是否以 /drive/ 开头

import os

os.getcwd()  # If successful:  "/drive/path/to/notebook"
             # ... otherwise:  "/home/pyodide"

获取远程内容#

也可以从远程 URL 获取内容。例如,如果您使用 Pyodide 内核,则可以使用 fetch 函数来实现此目的

import pandas as pd
from js import fetch

URL = "https://raw.githubusercontent.com/jupyterlite/jupyterlite/main/examples/data/iris.csv"

res = await fetch(URL)
text = await res.text()

filename = 'data.csv'

with open(filename, 'w') as f:
    f.write(text)

data = pd.read_csv(filename, sep=',')
data

作为替代方案,您可以导入 pyodide-http 包(默认随 Pyodide 分发)以更无缝地使用熟悉的方法

import pyodide_http
import pandas as pd

pyodide_http.patch_all()

data = pd.read_csv("https://raw.githubusercontent.com/jupyterlite/jupyterlite/main/examples/data/iris.csv")
data