pyodide 是什么?
Pyodide
是CPython到WebAssembly /Emscripten的一个接口,主要在浏览器中使用。
Pyodide
在浏览器中使用micropip
安装和运行Python
包。它附带了一个健壮的Javascript
⟺ Python
外部函数接口,这样您就可以在代码中自由地混合这两种语言,而不会产生太大的摩擦。这包括对错误处理(用一种语言抛出错误,用另一种语言捕获错误)、异步/等待等的完全支持。在浏览器中使用时,Python
可以完全访问Web API
。
一个简单的demo
我们可以随便新建一个index.html
写入以下代码
html
<head>
<script src="https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js"></script>
<script>
async function main() {
let pyodide = await loadPyodide({
indexURL: 'https://cdn.jsdelivr.net/pyodide/v0.20.0/full/',
})
console.log(pyodide.runPython("print('Hello, world from the browser!')"))
}
main()
</script>
</head>
打开控制台可以看到输出了“Hello, world from the browser!”,这代表我们的python
代码成功在浏览器环境跑起来了!
常用的语法
加载第三方库
导入 Pyodide
后只有 Python
标准库可用。要使用其他包,您需要使用以下任一方式加载它们:
micropip.install()
(Python) 用于带有轮子的纯 Python 包以及 Pyodide 包(包括 Emscripten/wasm32 二进制轮子)。它可以从 PyPI、JsDelivr CDN 或其他 URL 安装包。pyodide.loadPackage()
(Javascript) 用于使用 Pyodide 构建的包。这是一个开销较小但功能更有限的函数。micropip 使用这个函数来加载 Pyodide 包。在大多数情况下,您应该使用 micropip。
js
pyodide = await loadPyodide()
await pyodide.loadPackage('micropip')
const micropip = pyodide.pyimport('micropip')
await micropip.install('numpy')
输入js变量
我们可以用 pyodide.toPy(obj, options)
这个api
尽可能将 JavaScript
对象转换为 Python
对象。
如果对象是不可变的或 PyProxy
,它将原封不动地返回。如果对象不能转换为Python
,它将原封不动地返回。
js
const pyData = pyodide.toPy({
x: 1,
y: 2
})
const pyReturnData = pyodide.runPython(
`
print(x)
print(y)
`,
{ globals: pyData }
)
此时就会在python代码中输出x=1,y=2
输出python变量
当我们在python
代码中获得了想要的数据,该如何从javascript
中获取呢?
pyodide.runPython()
这个api,如果 Python
代码中的最后一条语句是表达式(并且代码不以分号结尾),则返回表达式的值。
js
const pyReturnData = pyodide.runPython(
`
x = 1
x
`
)
此时就会从javascript
中获取到x
的值,即pyReturnData=1