如何在浏览器中复制/下载在 Pyodide 中创建的文件?

krm*_*ani 8 python pyodide

我设法在浏览器中运行 Pyodide。我创建了hello.txt文件。但我怎样才能访问它。
Pyodide
https://github.com/iodide-project/pyodide/blob/master/docs/using_pyodide_from_javascript.md

pyodide.runPython('open("hello.txt", "w")')
Run Code Online (Sandbox Code Playgroud)

我在 chrome devtools 中尝试了什么?

pyodide.runPython('os.chdir("../")')
pyodide.runPython('os.listdir()')
pyodide.runPython('os.path.realpath("hello.txt")')
Run Code Online (Sandbox Code Playgroud)

输出为listdir

["hello.txt", "lib", "proc", "dev", "home", "tmp"]
Run Code Online (Sandbox Code Playgroud)

输出为realpath

"/hello.txt"
Run Code Online (Sandbox Code Playgroud)

还,

pyodide.runPython('import platform')
pyodide.runPython('platform.platform()')
Run Code Online (Sandbox Code Playgroud)

输出

"Emscripten-1.0-x86-JS-32bit"
Run Code Online (Sandbox Code Playgroud)

chrome devtools 控制台中的所有输出。

它是在根文件夹中创建的。但是如何在文件资源管理器中访问它或如何将文件复制到下载文件夹?

谢谢

rth*_*rth 7

事实上,pyodide 在Emscripten 创建的内存 (MEMFS) 文件系统中运行。您无法直接从 pyodide 将文件写入磁盘,因为它是在浏览器沙箱中执行的。

但是,您可以将文件传递给 JavaScript,从中创建一个Blob ,然后下载它。例如,使用,

let txt = pyodide.runPython(`                  
    with open('/test.txt', 'rt') as fh:
        txt = fh.read()
    txt
`);
const blob = new Blob([txt], {type : 'application/text'});
let url = window.URL.createObjectURL(blob);
window.location.assign(url);
Run Code Online (Sandbox Code Playgroud)

也应该可以使用pyodide 中包含的类型转换从 Python 端完成所有这些操作,即

from js import Blob, document
from js import window
  
with open('/test.txt', 'rt') as fh:
    txt = fh.read()
    
blob = Blob.new([txt], {type : 'application/text'})
url = window.URL.createObjectURL(blob) 
window.location.assign(url)
Run Code Online (Sandbox Code Playgroud)

然而目前,不幸的是这不起作用,因为它取决于 首先解决pyodide#788 。