探索 JSPyBridge,一个在 JavaScript 中使用 Python 的新库

Node.js 和 Python 是两个最流行的软件开发工具。每个都有其优点和缺点,有时可能很难从中进行选择,具体取决于手头的任务。例如,Node.js 运行时速度很快,并且拥有一个拥有数百万包的大型社区,但在数据科学和机器学习包方面,它与 Python 相比就相形见绌了。

根据您的问题,您可能会发现自己需要 Node.js 和 Python;但是,这些语言彼此不同,并且没有任何交流机制。

为了解决这个问题,创建了JSPyBridge以允许 Node.js 和 Python 互操作。语言互操作允许 Node.js 和 Python 一起工作,就好像它们是同一系统的一部分并共享数据结构一样。使用 JSPyBridge,您可以在 Node.js 中导入和使用 Python API 方法,就好像它们是原生的一样,反之亦然。

在本教程中,我们将使用 JSPyBridge 在 Node.js 和 Python 之间进行互操作。前半部分,我们将了解如何在 Python 中访问和使用 Node.js 函数、包、类和数组。后半部分,我们将看看如何在 Node.js 中使用 Python 函数、模块、类和数组。

跳跃前进:

  • 什么是 JSPyBridge?

  • 在 Python 中访问 JavaScript

    • 在 Python 中导入 JavaScript 函数

    • 在 Python 中导入和使用 Node.js 包

    • 在 Python 中使用 ES2015 类

    • 在 Python 中使用 JavaScript 可迭代对象

    • 在 Python 中从不同的目录导入 JavaScript 文件

  • 在 Node.js 中访问 Python

    • 在 Node.js 中导入 Python 函数

    • 在 Node.js 中使用 Python 第三方模块

    • 在 Node.js 中使用 Python 类

    • 在 Node.js 中使用 Python 可迭代对象

先决条件

要充分利用本教程,您应该具备:

  • Node.js v ≥ 14 安装在您的计算机上

  • 已安装 Python v ≥ 3.8

  • 如何使用 Node.js 和 Python 的基本知识

什么是 JSPyBridge?

JSPyBridge 是一个允许 Node.js 和 Python 互操作的桥梁。您可以将其视为位于两种编程语言之间的文字桥梁,从一种语言获取数据或对象并对其进行转换,以便另一方的语言可以解析它们。

可以在 Python 和 Node.js 之间共享的一些对象是函数、类、可迭代对象和回调。例如,在使用 JSPyBridge 时,您可以将 Python 中的函数导入 Node.js,调用它,然后访问 Node.js 中的返回值。

以下是 JSPyBridge 功能的简要概述:

  • 垃圾收集

  • 扩展和调用类

  • 支持回调、函数、类和可迭代对象

  • 导入本地文件

  • 管理错误

有关更多功能,请参阅Bridge 功能比较表。


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


在 Python 中访问 JavaScript

在本节中,我们将了解如何在 Python 中访问 Node.js 函数、包、类和数组。为此,我们将创建一个项目目录并下载javascript模块,它是 JSPyBridge 的一个依赖项。

首先,创建项目目录并使用以下命令切换到该目录:

mkdir python_demo && cd python_demo

由于这是一个 Python 目录,因此为项目创建一个虚拟环境:

python3 -m venv venv

激活虚拟环境:

源 venv/bin/激活

创建虚拟环境后,安装javascript模块:

pip3 安装 javascript

现在我们已经设置了环境,我们将开始将 Node.js 与 Python 进行互操作。

在 Python 中导入 JavaScript 函数

让我们在 Python 中创建并调用一个 JavaScript 函数。该函数会将整数值格式化为您选择的货币。然后,您将在 Python 中导入 JavaScript 函数,将参数传递给它,并打印返回值。

在编辑器中打开formatCurrency.js文件并添加以下内容:

函数格式货币(值,类型){
  format = new Intl.NumberFormat("en-US", {
    风格:“货币”,
    货币:类型,
  })。格式;
  返回格式(值);
}
module.exports = { formatCurrency };

在前面的代码块中,我们定义了一个formatCurrency()函数,它接受两个参数:


来自 LogRocket 的更多精彩文章:

  • 不要错过来自 LogRocket 的精选时事通讯The Replay

  • 使用 React 的 useEffect优化应用程序的性能

  • 在多个 Node 版本之间切换

  • 了解如何使用 AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js

  • 发现TypeScript 领域中使用的流行 ORM


  1. value, 金额

  2. type, 我们希望金额格式化为的货币

在函数中,我们创建了一个Intl.NumberFormat实例,它将语言en-US作为第一个参数,并将一个包含格式化选项的对象作为第二个参数。

该对象有两个属性:style和currency。该style属性接受格式样式,即currency此处的字符串。该currency属性接受存储在type变量中的短格式货币名称。

创建Intl.NumberFormat实例后,将返回一个函数并将其存储在format变量中。接下来,您使用参数作为参数调用该format()函数。value一旦format()函数运行,formatCurrency()函数就会返回结果。最后,我们导出函数formatCurrency(),以便它可以在 Python 中使用。

现在已经定义了函数,我们将在 Python 中引用它。在编辑器中打开并创建format_currencies.py文件并添加以下内容:

从 javascript 导入需要
​
数据 = 要求(“./formatCurrency.js”)
​
值 = 2000000
​
打印(data.formatCurrency(值,“美元”))
打印(data.formatCurrency(值,“欧元”))

首先,我们从模块中导入require方法。接下来,我们使用 JavaScript 文件的路径javascript调用该方法。之后,我们定义一个整数并将其存储在变量中。在最后两行中,我们使用变量和我们想要的货币调用 。require()formatCurrency.jsvalueformatCurrency()value

现在,运行format_currency.py文件:

python3 format_currencies.py

运行文件后,您将看到如下所示的输出:

2,000,000.00 美元
2,000,000.00 欧元

这表明 Python 调用了 JavaScript 函数,检索了返回值,并将其记录在终端中。

在 Python 中导入和使用 Node.js 包

Node.js 有许多可以在项目中使用的包,而 JSPyBridge 允许您在 Python 中导入和使用它们。您甚至不必使用 npm 安装它们——当您require()使用包名调用方法时,JSPyBridge 会自动为您获取包。

在本节中,我们将使用 Python 中的sqlstring npm 包。该sqlstring模块可用于为 MySQL 转义和格式化 SQL 语句。

generateSQL.py在文本编辑器中打开文件:

从 javascript 导入需要

sqlString = 要求(“sqlstring”)

name = input("你叫什么名字?n")
sql = sqlString.format("SELECT * FROM customers WHERE name = ?", [name])

打印(sql)

首先,我们从模块中导入require方法。javascript其次,我们以为参数调用require()方法。sqlstring接下来,我们调用 Python 的input()方法来获取用户输入,然后调用模块的format()方法,该方法sqlstring将 SQL 查询作为参数。最后,我们打印格式化的 SQL 查询。

现在运行该文件并在出现提示时输入一个名称:

python3 生成SQL.py

运行该文件会产生如下所示的输出:

安装 'sqlstring' 版本 'latest'... 这只会发生一次。

添加了 1 个包,并在 502 毫秒内审核了 2 个包

发现0个漏洞

 好的。
你叫什么名字?
约翰

SELECT * FROM customers WHERE name = 'john'

请注意,当您第一次运行该文件时,JSPyBridge 会下载该包的输出。下载后,该模块用于生成 SQL 语句,Python 将其记录在终端中。

在 Python 中使用 ES2015

在本节中,我们将导入一个 ECMAScript 2015 (ES6) 类,对其进行实例化,然后在 Python 中调用实例方法。

创建一个名为的新文件person.js:

类人{
  构造函数(名字,姓氏){
    this.firstName = 名字;
    this.lastName = 姓氏;
  }

  获取全名(){
    返回`${this.firstName} ${this.lastName}`;
  }
}

module.exports = {人};

该类Person有两个参数:firstName和lastName. 它还有一个getFullName()方法可以连接firstName和lastName参数以生成全名。

要在 Python 中使用该类,我们使用module.exports. 现在,在您的编辑器中创建另一个文件create_person.py文件并添加以下内容:

从 javascript 导入需要

数据 = 要求(“./person.js”)
person_one = data.Person.new("John", "Doe")
打印(person_one.getFullName())

在这里,我们导入require()并引用 JavaScript 文件person.js。Person接下来,我们通过调用该方法创建该类的一个实例,该new()方法将名字和姓氏作为参数。最后,我们调用类的getFullName()方法Person并在终端打印返回值。

保存文件并运行person.py:

python3 create_person.py

运行该文件将产生以下输出:

约翰·多伊

输出显示名称 first name 和 last name 已连接。这证实了我们可以在 Python 中调用和使用 JavaScript ES2015 类。

轻下载App,短视频无水印一键解析,多平台视频、音频、图片的一键下载!

在 Python 中使用 JavaScript 可迭代对象

让我们在 Node.js 中创建一个数组,将其导出,然后在 Python 中对其进行迭代。我们将在formatCurrency.js程序的基础上使用该formatCurrency()函数来格式化多个值并将它们附加到一个数组中。该数组将在 Python 中导出和迭代。

使用以下内容创建以下文件formatValues.js:

值 = [200, 40000000, 2938, 80999];
usd_values = [];
函数格式货币(值,类型){
  format = new Intl.NumberFormat("en-US", {
    风格:“货币”,
    货币:类型,
  })。格式;
  返回格式(值);
}

for (让 i = 0; i < values.length; i++) {
  usd_values.push(formatCurrency(values[i], "USD"));
}

module.exports = { 项目:usd_values };

我们创建一个values数组,其中包含要格式化为货币的数字。接下来,我们定义一个空数组、usd_values值和以formatCurrency()您选择的货币格式化给定值的函数。

在此之后,我们遍历values数组,在每次迭代期间,我们调用formatCurrency()函数并将格式化的值推送到usd_values数组中。循环结束后,我们导出一个具有items属性的对象,其值为usd_values数组。

接下来,我们将在 Python 中导入数组。list_currencies.py使用以下内容创建文件:

从 javascript 导入需要

数据 = 要求(“./formatValues.js”)
对于 data.items 中的项目:
    打印(项目)

首先,我们引用formatValues.js文件。接下来,我们遍历 Node.js 数组并在每次迭代期间打印该值。

现在,使用以下python3命令运行文件:

python3 list_currencies.py

运行命令时,您将看到类似于以下内容的输出:

$200.00
40,000,000.00 美元
2,938.00 美元
80,999.00 美元

输出确认我们可以在 Python 中迭代 JavaScript 数组。

在 Python 中从不同的目录导入 JavaScript 文件

到目前为止,我们研究了如何从 Node.js 导入函数、类和可迭代对象,并在同一项目目录中的 Python 中运行它们。在本节中,我们将驻留在另一个目录中的 Node.js 数组导入 Python 并循环遍历每个元素。

首先,移出项目目录:

光盘..

接下来,创建一个新的项目目录并进入该目录:

mkdir currency_app && cd currency_app

将目录初始化为 npm 项目:

npm 初始化 -y

接下来,安装包,它会生成一个通用唯一标识符 (UUID),您可以使用它来唯一标识对象:uuid

npm 安装 uuid

接下来,创建一个新文件formatValues.js,并添加以下内容:

常量 { v4: uuidv4 } = 要求(“uuid”);

值 = [200, 40000000, 2938, 80999];
usd_values = [];
函数格式货币(值,类型){
  format = new Intl.NumberFormat("en-US", {
    风格:“货币”,
    货币:类型,
  })。格式;
  返回格式(值);
}

for (让 i = 0; i < values.length; i++) {
  usd_values.push({
    id: uuidv4(),
    货币:formatCurrency(values[i], "USD"),
  });
}

控制台.log(usd_values);

module.exports = { 项目:usd_values };

该文件重用了我们在上一节中的大量代码;但是,有新的变化。首先,我们导入 UUID 模块。在for循环中,我们不是只推送值,而是创建一个具有以下属性的对象:id和currency.

该id属性被分配一个 UUID,通过调用uuidv4()UUID 模块的函数生成。该currency属性被分配一个从调用formatCurrency()函数返回的值。最后,我们有一个在控制台console.log()中记录数组的方法。usd_values

这样,使用以下node命令运行文件:

节点格式Values.js

您将看到如下所示的输出:

[
  { id: 'bfdb0bd6-0e9a-4275-812f-dd1b81dde930', 货币: '$200.00' },
  {
    id: '31b0d44a-8987-4f50-a683-99f4af477e6d',
    货币:'$40,000,000.00'
  },
  { id: 'ab9f0e76-875d-4e77-8bb9-61015b8a1a46', 货币: '$2,938.00' },
  {
    id: 'f035883d-952a-4642-8c66-379858601f5f',
    货币:'$80,999.00'
  }
]

输出显示确认正在使用 UUID 创建对象。

现在,删除文件中的console.log()方法formatValues.js。我们不再需要它,因为数组内容将在 Python 中显示。

现在我们知道程序运行成功了,我们将数组导入主项目目录,python_demo.

返回主项目目录:

cd .. && cd python_demo

在项目目录中,list_usd_values_with_uuid.py使用以下内容在编辑器中创建一个文件:

从 javascript 导入需要

数据 = 要求(“./../currency_app/formatValues.js”)
对于 data.items 中的项目:
    打印(f'ID:{item.id}')
    print(f'美元金额:{item.currency}')
    打印(“n”)

在代码块中,我们引用formatCurrencies.js了位于另一个目录中的 。接下来,我们遍历数组中的所有元素,并在控制台中打印项目 UUID 和格式化货币。

现在,运行list_usd_values_with_uuid.py文件:

python list_usd_values_with_uuid.py

运行代码会产生以下结果:

编号:35295372-eedc-44bd-8e19-360a990a1a44
美元金额:200.00 美元


编号:c446ae79-3904-4c8b-8e74-31d4184612ca
美元金额:40,000,000.00 美元


编号:13ce5e1a-7f0a-4d81-bfd4-d18229a1b159
美元金额:2,938.00 美元


编号:755e1f39-3cad-4128-b806-4681acccd7d7
美元金额:80,999.00 美元

正如您在输出中看到的,我们可以成功地遍历另一个项目目录中的数组。

现在您已经知道如何使用 JSPyBridge 在 Python 中访问 Node.js API,我们将在下一节中访问 Python API。

在 Node.js 中访问 Python

在本节中,我们将访问 Node.js 中的 Python 模块、本地 Python 文件、函数、类和可迭代对象。为此,我们将创建另一个目录,其中包含我们的 Node.js 代码以及 Python 文件。

首先,移出当前目录并返回主目录:

光盘..

现在,在主目录中,创建一个新目录并将其更改为:

mkdir node_demo && cd node_demo

因为这是一个 Node.js 目录,所以初始化npm:

npm 初始化 -y

接下来,安装pythonia 包,它是 Node.js 的桥梁:

npm 安装 pythonia

接下来,"type": "module"在您的末尾添加一行package.json以允许 Node.js 使用 ES2015 模块:

{
  ...
  “许可证”:“ISC”,
  “依赖”:{
    “pythonia”:“^1.0.0”
  },
  “类型”:“模块”
}

有了它,您现在可以在 Node.js 中使用 JSPyBridge。接下来,我们将导入一个 Python 函数并在 Node.js 中调用它。

在 Node.js 中导入 Python 函数

在本节中,我们将在 Python 中创建一个函数,将其导入,然后在 Node.js 中运行该函数。该函数将使用 Python 中的random模块。

创建一个random_choices.py文件并添加以下内容:

随机导入


def get_random_word():
    颜色 = [“红色”、“绿色”、“蓝色”、“黄色”]
    返回随机选择(颜色)

在第一行,random从 Python 导入模块。然后我们定义一个函数 ,它在数组get_random_word()中打乱并返回一个随机值。colors

接下来,pickRandomValue.js使用以下代码创建文件:

从“pythonia”导入{python};
const rand = await python("./random_choices.py");
console.log(等待 rand.get_random_word());
python.exit();

从包中导入python函数。pythonia接下来,python()使用路径作为参数调用函数random_choices.py,然后启动 Python 进程。

在 Node.js 中,JSPyBridge 要求每个 Python API 调用都以await关键字为前缀。在此之后,我们调用该get_random_word()函数并将结果记录到终端中。最后,我们退出该过程。

现在,使用以下node命令运行文件:

节点pickRandomValue.js

运行命令时,您将看到类似于以下内容的输出:

红色的

输出显示red。你的可能会显示不同的颜色,因为毕竟包返回随机值。

在 Node.js 中使用 Python 第三方模块

在本节中,我们将使用 Node.js 中的第三方 Python 模块。我们的程序将使用Matplotlib和NumPy创建一个图形。

首先,停用当前的虚拟环境:

停用

在目录中创建一个新的虚拟环境:

python3 -m venv venv

激活虚拟环境:

源 venv/bin/激活

接下来,使用以下命令安装以下模块:

pip3 安装 numpy matplotlib

要在 JavaScript 中使用模块,请创建一个plot_graph.js文件并添加以下内容:

从'pythonia'导入{python}
const np = await python('numpy')
const plt = await python('matplotlib.pyplot')
​
​
const x = await np.array([1, 2, 3])
const y = await np.array([4, 1, 2])
​
等待 plt.plot(x, y)
​
await plt.title('Node.js 中的 matplotlib 图')
​
等待 plt.savefig('graph.png')
python.exit()

首先,我们python()从pythonia. 在接下来的两行中,我们调用python函数来导入 NumPy 和 Matplotlib 模块。

接下来,我们使用np.array()方法定义数组,这些数组存储在x和y变量中。在此之后,我们调用plt.plot(),它将数组x和y变量作为参数。之后,我们使用该plt.title()方法来定义图形的标题。然后我们调用plt.savefig()将图形保存为目录中的图像。最后,我们退出 Python 进程。

现在,运行文件:

节点 plot_graph.js

当命令运行时,您graph.png的目录中将有一个图像,如下所示: 

在 Node.js 中使用 Python 类

在本节中,我们将在 Python 中定义一个类并在 Node.js 中实例化它。

person.py使用以下内容创建文件:

类人:
    def __init__(self, firstName, lastName):
        self.firstName = 名字
        self.lastName = 姓氏
​
    def getFullName(自我):
        返回 f"{self.firstName} {self.lastName}"

Python 类类似于Person我们之前定义的 ES2015 类。该类有两个参数:firstName和lastName. 它还有一个getFullName()方法可以返回人的全名。

要Person在 Node.js 中使用该类,请导入该createPerson.js文件:

从“pythonia”导入{python};
常量数据 = 等待 python("./person.py");
const person1 = await data.Person("John", "Doe");
console.log(等待 person1.getFullName());
python.exit();

首先,我们从中导入Python函数pythonia,然后引用该person.py文件。其次,我们通过Person使用名字和姓氏作为参数调用类来创建一个实例。我们调用getFullName()方法,它返回全名,然后我们在控制台中打印。最后,和往常一样,我们退出 Python 进程。

现在,使用以下命令运行文件node:

节点 createPerson.js

它将产生如下所示的输出:

约翰·多伊

这表明我们可以在 Node.js 中成功使用 Python 类。

在 Node.js 中使用 Python 可迭代对象

在本节中,我们将在 Python 中创建一个列表,并遍历 Node.js 中的每个元素。

首先,get_dir_contents.py使用以下内容创建:

导入操作系统
​
dir_files = os.listdir("./node_modules")

我们首先导入os模块。接下来,我们调用模块listdir()的方法,该方法os返回给定目录中所有文件的列表node_modules。

现在我们有了 Python 中的列表,我们将导入它并在 Node.js 中调用它。

首先,创建listDir.js文件并添加以下内容:

从“pythonia”导入{python};
const obj = await python("./get_dir_contents.py");
常量 dirFiles = 等待 obj.dir_files;
​
for await(dirFiles 的 const 文件){
  控制台.log(文件);
}
​
python.exit();

首先,我们使用我们在第一行中导入的函数引用该listDir.py文件。python()接下来,我们解包dir_files数组并将其存储在dirFiles变量中。

之后,我们定义一个for await循环来遍历所有元素并在每次迭代期间将每个文件记录在控制台中。JSPyBridge 不建议在从 Python 中循环遍历数组时使用其他循环。

接下来,运行listDir.js文件:

节点列表目录.js

当命令运行时,您将看到类似于以下内容的输出:

ansi风格
颜色名称
有标志
ws
蟒蛇
粉笔
.package-lock.json
呼叫者
支持颜色
颜色转换

这表明 Node.js 可以循环遍历 Python 数组。

结论

在本文中,我们学习了如何使用 JSPyBridge 来互操作 Node.js 和 Python。前半部分,我们研究了如何在 Python 中使用 JSPyBridge。我们学习了如何导入和使用以下内容:

Python 中的 Node.js Node.js 中的 Python
功能Node.js 包ES2015 课程可迭代的其他项目文件夹中的 Node.js 文件 功能班级可迭代的第三方模块

要了解有关 JSPyBridge 的更多信息,请访问JSPyBridge 文档。您还可以在他们的 GitHub 存储库中查看更多示例。如果您想学习如何在前端使用 Python,请参阅PyScript 教程。

仅200个监控生产中失败和缓慢的网络请求

部署基于节点的 Web 应用程序或网站是很容易的部分。确保您的 Node 实例继续为您的应用程序提供资源是事情变得更加困难的地方。如果您有兴趣确保对后端或第三方服务的请求成功,请尝试 LogRocket。

LogRocket就像一个用于网络和移动应用程序的 DVR,记录用户与您的应用程序交互时发生的所有事情。无需猜测问题发生的原因,您可以汇总和报告有问题的网络请求,以快速了解根本原因。

LogRocket 检测您的应用程序以记录基准性能时间,例如页面加载时间、第一个字节的时间、缓慢的网络请求,并记录 Redux、NgRx 和 Vuex 操作/状态。

你可能感兴趣的:(python,javascript,开发语言)