前言
在传统的 web 开发中,python 通常更多地被用作服务器端语言(如 django、flask 等),而在浏览器端(前端)通常使用 javascript 来操作 dom、进行事件处理等。不过,随着 webassembly 技术的发展和一些 python-to-javascript 转译方案的出现,我们已经可以在前端直接运行(或间接编译)python 代码。
下面将详细介绍在前端运行 python 程序的多种主要方式、它们的优点和局限性,并附带一些示例或基本使用思路。
一、直接在浏览器运行 python:基于 webassembly 的 pyodide
1. 什么是 pyodide
pyodide 是基于 webassembly 的一个完整 python 解释器项目,它将 cpython(python 的官方解释器)编译成了可以在浏览器环境(或者其它 webassembly 运行环境)里执行的版本。换句话说,你不需要安装任何插件,只要浏览器支持 webassembly,你就可以在前端环境里运行几乎完整的 python。
2. pyodide 的主要特点
- 兼容性好:几乎完整移植了 cpython,包括标准库和部分第三方库的支持(如 numpy、pandas 等)。
- 易集成:官方提供了一个
pyodide.js
(或pyodide.mjs
),前端只要将其引入即可使用。 - webassembly 性能:相较于纯 javascript 解释 python 的方案,pyodide 的性能更好。
3. 如何使用 pyodide
引入 pyodide.js从官方的 cdn 或者本地托管,引入 pyodide 脚本:
<script src="https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js"></script>
提示:版本号可能会不断更新,可以去 pyodide releases 查看最新版本。
初始化 pyodide 环境
<script> async function initpyodide() { // 加载 pyodide let pyodide = await loadpyodide(); // 在这里就可以使用 pyodide.runpython 执行 python 代码了 let result = pyodide.runpython(\` import sys sys.version \`); console.log("python version:", result); } initpyodide(); </script>
执行 python 代码
pyodide.runpython(code)
可以直接执行一段 python 代码字符串,并返回最后一行表达式的值(如果有)。pyodide.globals
可以获取当前 python 解释器中全局作用域的变量。- 除了执行简单的脚本外,还可以加载第三方库(部分纯 python 库已经预编译到 pyodide 里)。
示例:
<script> async function initpyodide() { let pyodide = await loadpyodide(); // 安装 / 加载一些包 await pyodide.loadpackage("micropip"); // micropip 可以安装更多的 python 包,但需要兼容 wasm,如 pyodide.org 中提到的包 // 运行简单的 python 代码 let code = \` import math def compute_circle_area(r): return math.pi * (r ** 2) area = compute_circle_area(5) \`; pyodide.runpython(code); let area = pyodide.globals.get("area"); console.log("circle area:", area); } initpyodide(); </script>
4. 优缺点
- 优点:
- 几乎完整地支持 python 生态,能够直接使用很多 python 包,尤其是科学计算相关。
- 依赖 webassembly,高度还原 cpython 功能,运行效率相对其他纯 js 解释器更高。
- 缺点:
- 体积较大,需要加载编译好的 python 解释器和相关包,初次加载可能会比较耗时。
- 并非所有 python 包都能在 pyodide 中使用,一些依赖本地 c/c++ 扩展的库需要专门移植。
二、brython:将 python 作为浏览器脚本语言
1. 什么是 brython
brython 是一款用 javascript 实现的 python 解释器,它的目标是让 python 可以取代前端开发中 javascript 的地位。它提供了一个运行时环境,使用纯 javascript 解释 python 语法,并且封装了一系列 dom 操作、浏览器接口等,使得你可以像写 javascript 一样来操作浏览器对象。
2. brython 的使用
- 引入 brython
<script src="https://cdn.jsdelivr.net/npm/brython@3.11.0/brython.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/brython@3.11.0/brython_stdlib.js"></script>
- html 标记与启动在
<body>
标签中添加onload="brython()"
或者用 javascript 的方式在 dom 加载后初始化 brython:<body onload="brython()"> ... </body>
- 在
<script type="text/python">
中编写 pythonbrython 允许我们直接在 html 文件中使用<script type="text/python">
标签来书写前端 python 代码,如:这里<script type="text/python"> from browser import document, alert def greet(ev): alert("hello from brython!") document["mybutton"].bind("click", greet) </script>
document["mybutton"]
与 javascript 中的document.getelementbyid("mybutton")
类似。
3. 优缺点
- 优点:
- 使用非常简单,直接
<script type="text/python">
就能写代码。 - 对 dom 操作进行了一定的封装,可以让 python 代码操作浏览器 api。
- 代码体积相对 pyodide 更小(毕竟没有完整移植 cpython)。
- 使用非常简单,直接
- 缺点:
- brython 并不包含完整的 python 标准库实现,某些场景下功能有限。
- 由于是纯 javascript 解释,需要考虑性能影响,复杂运算性能可能远低于 webassembly 方案。
- 一些 python 第三方库可能无法直接使用,或需要依赖特定的 polyfill。
三、transcrypt:python 转译成 javascript
1. 什么是 transcrypt
transcrypt 是一个将 python 代码编译成高质量、可读性较高的 javascript 代码的工具。可以在开发阶段用 python 编写逻辑,然后通过 transcrypt 将其编译成 javascript,最终在浏览器端运行的还是 javascript。
2. 工作流程
- 安装 transcrypt:
pip install transcrypt
- 使用 transcrypt 编译 python 文件:
transcrypt -b -m myscript.py
-b
表示在浏览器模式下编译(browser)。-m
表示生成映射文件(source map)。
- 编译完成后,会生成一个
__javascript__
文件夹,里面有myscript.js
以及依赖文件。 - 在 html 中引入编译后的 js 文件:
<script src="__javascript__/myscript.js"></script>
- 这样,就可以在浏览器端使用转换后的 js 逻辑。
3. 优缺点
- 优点:
- 保持了 python 语法的开发体验。
- 得到的 javascript 体积相对较小,且没有额外的运行时依赖。
- 编译后的速度与 javascript 本身类似(毕竟最终产物是 js)。
- 缺点:
- 并不是在浏览器里直接执行 python,而是将 python 转译成 js,某种程度上要对 python 语法有一定限制。
- 对于 python 的某些动态特性和部分库支持不完美。
四、skulpt、rapydscript 等其他方案
除上述方案外,还有一些项目也能帮助在前端运行(或近似运行)python:
skulpt
- 纯 javascript 实现的 python 解释器。
- 支持 python 语法的子集,适用于教学或简单脚本场景。
- 不支持完整标准库。
rapydscript
- 一种 python-like 语法,编译成高效的 javascript。
- 更接近于一种独立的语言,兼具 python 与 javascript 的特性。
trinket、replit 等在线平台
- 通过远程服务器或 webassembly 内嵌的方式,在网页里直接运行 python 代码。
- 适合教学、演示或小型项目试验。
五、适合不同场景的选择建议
如果你希望在浏览器端完整运行 python 并使用科学计算库(如 numpy、pandas 等)
- pyodide 是首选方案,但要注意加载速度、兼容性以及内存使用。
如果你想在前端用 python 语法来操作 dom,替代部分 javascript 功能
- brython 可以尝试,不过要注意第三方库的支持以及性能。
如果你的核心需求仍然是将 python 逻辑转成最终的 javascript
- transcrypt 可以帮助你在保持 python 开发体验的同时,得到优化后的纯 js 代码。
如果你是教学或简单的 python 脚本交互
- skulpt、trinket 这类项目或在线平台可以快速上手,但功能相对有限。
六、总结
在浏览器里运行 python 不再是遥不可及的想法,随着 webassembly 的普及和多种 python-to-javascript 解决方案的出现,前端与 python 生态之间的融合将越来越紧密。选择具体方案时,需要综合考虑:
- 是否需要大量使用 python 第三方库?
- 对性能与包体积的要求如何?
- 是否需要调用浏览器的 dom 或 web api?
- 是否只是教学、实验,还是要应用到生产环境?
无论是直接基于 webassembly 的 pyodide、javascript 实现的 brython,还是把 python 编译/转译为 javascript 的 transcrypt,都是在不同场景下可选的思路。未来,随着 web 技术的进一步发展,前端与 python 的结合也会更容易、更高效。希望以上介绍能帮助你更好地理解和选择前端运行 python 的最佳方式。
到此这篇关于如何在浏览器前端运行python程序的文章就介绍到这了,更多相关浏览器前端运行python程序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论