Brython 如何工作

17 Mar 2025 | 5 分钟阅读

要理解Brython的工作原理,我们首先需要使用我们偏好的方法安装Brython,这我们在“如何安装Brython”文章中已经讨论过。

在讨论Brython的工作原理之前,我们需要了解几件事

  • 如何实现JavaScript中的Python
  • 如何将Python翻译成JavaScript,以及在浏览器中运行的运行时执行器。
  • JavaScript文件中的两个主要库
    • brython_stdlib.js,这是Brython的标准库
    • brython.js,这是brython语言的核心
  • 如何调用brython(),它将编译存储在script标签中、类型为text/python的Python程序。

在本文中,我们将讨论Brython的核心组件、标准库以及它的工作原理。

Brython核心组件

brython.js和brython.min.js(Brython引擎的最小化版本)包含Brython的核心组件。它们都包含以下关键组件:

brython.js和brython.min.js(Brython引擎的最小化版本)包含Brython的核心组件。它们都包含以下关键组件:

  • _BRYTHON_:这是JavaScript的全局对象,它保存着运行Python脚本所需的所有内部对象。_BRYTHON_不直接用于编写Brython应用程序。如果我们查看Brython程序(Python和JavaScript),我们会注意到_BRYTHON_的频繁出现。我们不需要使用这个对象,但当我们看到错误时,或者当我们想在浏览器控制台中调试程序时,应该意识到它的存在。
  • Brython():这是在JavaScript全局命名空间中暴露的主要JavaScript函数。不调用此函数就无法执行任何Python程序。这是我们唯一需要显式调用的JavaScript函数。
  • Browser:这是浏览器模块,它暴露了前端网站应用程序中常用的JavaScript对象,例如用于文档的Document Object Model接口,以及浏览器窗口使用的window对象。
  • Built-in types:这些是JavaScript中Python内置类型的实现。例如,py_dicts.js、py_string.js和py_int.js分别是dict、str和int的实现。

Brython标准库

在了解了核心Brython文件brython.js之后,我们将学习其配套文件brython_stdlib.js。

Python标准库由brython_stdlib.js暴露。在生成brython_stdlib.js文件后,Brython可以将Python标准库编译成JavaScript,并将结果链接到brython_stdlib.js包中。

Brython力求接近CPython,即Python的首选实现。由于Brython在网站浏览器的上下文中运行,它有一些限制,例如浏览器不允许直接访问文件系统,因此,os.open()函数无法打开文件。与网站浏览器无关的函数无法实现。

例如

# 在Brython环境中运行代码

输出

TypeError                                 Traceback (most recent call last)
<ipython-input-1-85e82a7fc62f> in <module>
      1 import os
----> 2 os.unlink()

TypeError: unlink() missing required argument 'path' (pos 1)

这里,os.unlink()会引发一个异常,因为它在浏览器环境中删除本地文件不安全,而File and Directories Entries API只是一个默认提议。

Brython只支持原生Python模块。它不支持用C编写的Python模块,除非它们已经用JavaScript重新实现。例如,hashlib模块是用C编写的,在Brython中用JavaScript实现。用户和开发者还可以参考Brython发行版中的模块列表来与CPython实现进行比较。

用户需要包含brython_stdlib.js和brython_stdlib.min.js才能从Python标准库导入模块。

Brython工作原理

现在,让我们看看Brython如何在浏览器中工作,而浏览器只了解其JavaScript引擎。我们将通过一个例子以及浏览器中可用的工具来理解这一点。我们将学习在浏览器中执行Python代码所涉及的过程。

例如

加载和解析HTML页面后,brython()将执行以下步骤:

  1. 它将读取存储在