有了Pyodide,浏览器运行Python顺理成章?

前有科技后进阶 2024-06-01 07:15:49

大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

什么是 Pyodide

Pyodide is a Python distribution for the browser and Node.js based on WebAssembly

Pyodide 是 CPython 到 WebAssembly/Emscripten 的端口,本质上 CPython 是解释器和编译器,其在解释 Python 代码之前将其编译为字节码,也是最初的 Python 实现。

micropip :是 Pyodide 和其他使用 Pyodide 项目的轻量级软件包安装程序。

Pyodide 使得使用 micropip 在浏览器中安装和运行 Python 包成为可能,目前支持 PyPi 上提供的任何带有 wheel 的纯 Python 包。 同时,许多带有 C 扩展的软件包也已被移植以与 Pyodide 一起使用。 其中包括许多通用包,例如: regex、PyYAML、lxml 和科学 Python 包,包括: NumPy、pandas、SciPy、Matplotlib 和 scikit-learn。

Pyodide 配备了强大的 Javascript 和 Python 互操作性的外部函数接口,以便开发者可以在代码中自由地混合这两种语言,包括:错误处理、异步 / await 等的全面支持。同时,在浏览器中使用时,Python 可以完全访问 Web API。

目前 Pyodide 在 Github 通过 MPL-2.0 协议开源,有超过 12k 的 star、1k 的 fork、1.5k 的项目使用量,是一个值得关注的前端开源项目。

如何使用 Pyodide

Pyodide 可以在 Web 浏览器或后端 JavaScript 环境中使用。

要在网页中使用 Pyodide,开发者需要加载 pyodide.js 并使用 loadPyodide() 初始化 Pyodide:

<!doctype html><html> <head> <script src="https://cdn.jsdelivr.net/pyodide/v0.25.1/full/pyodide.js"></script> </head> <body> <script type="text/javascript"> // 直接编写脚本,然后调用 runPython 方法 async function main(){ let pyodide = await loadPyodide(); console.log(pyodide.runPython("1 + 2")); } main(); </script> </body></html>

由于 Pyodide 依赖于 Webassembly,目前在 Firefox>112、Chrome>112、Safari>16.4 浏览器中经过充分测试,可以立即使用。因此,非常建议在高于当前版本的浏览器中使用。

当然,开发者也可以在 Node.js 中安装 Pyodide npm 包,但至少需要 Pyodide 0.21.0,而且非常建议 Node.js >=18.5.0 版本。

npm install "pyodide@>=0.21.0-alpha.2"

安装依赖后即可通过下面方式运行脚本:

// hello_python.jsconst {loadPyodide} = require("pyodide");async function hello_python() { let pyodide = await loadPyodide(); return pyodide.runPythonAsync("1+1");}hello_python().then((result) => { console.log("Python says that 1+1 =", result);});

或者开发者甚至可以使用 REPL,但是要启动支持顶级等待 (top level await) 的 Node.js REPL 需要使用 node --experimental-repl-await:

$ node --experimental-repl-awaitWelcome to Node.js v18.5.0.Type ".help" for more information.> const {loadPyodide} = require("pyodide");undefined> let pyodide = await loadPyodide();Loading distutilsLoaded distutilsundefined> await pyodide.runPythonAsync("1+1");2

更多关于 Pyodide 的内容和用法可以参考文末资料,本文不再过多展开。

参考资料

https://github.com/pyodide/pyodide

https://pyodide.org/en/stable/usage/index.html

https://micropip.pyodide.org/en/stable/

https://www.classcentral.com/

https://www.linkedin.com/

0 阅读:0

前有科技后进阶

简介:感谢大家的关注