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 是一个允许 Node.js 和 Python 互操作的桥梁。您可以将其视为位于两种编程语言之间的文字桥梁,从一种语言获取数据或对象并对其进行转换,以便另一方的语言可以解析它们。
可以在 Python 和 Node.js 之间共享的一些对象是函数、类、可迭代对象和回调。例如,在使用 JSPyBridge 时,您可以将 Python 中的函数导入 Node.js,调用它,然后访问 Node.js 中的返回值。
以下是 JSPyBridge 功能的简要概述:
垃圾收集
扩展和调用类
支持回调、函数、类和可迭代对象
导入本地文件
管理错误
有关更多功能,请参阅Bridge 功能比较表。
超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →
在本节中,我们将了解如何在 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 函数,将参数传递给它,并打印返回值。
在编辑器中打开formatCurrency.js文件并添加以下内容:
函数格式货币(值,类型){ format = new Intl.NumberFormat("en-US", { 风格:“货币”, 货币:类型, })。格式; 返回格式(值); } module.exports = { formatCurrency };
在前面的代码块中,我们定义了一个formatCurrency()函数,它接受两个参数:
不要错过来自 LogRocket 的精选时事通讯The Replay
使用 React 的 useEffect优化应用程序的性能
在多个 Node 版本之间切换
了解如何使用 AnimXYZ 为您的 React 应用程序制作动画
探索 Tauri,一个用于构建二进制文件的新框架
比较NestJS 与 Express.js
发现TypeScript 领域中使用的流行 ORM
value, 金额
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.js
valueformatCurrency()
value
现在,运行format_currency.py文件:
python3 format_currencies.py
运行文件后,您将看到如下所示的输出:
2,000,000.00 美元 2,000,000.00 欧元
这表明 Python 调用了 JavaScript 函数,检索了返回值,并将其记录在终端中。
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 将其记录在终端中。
在本节中,我们将导入一个 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 类。
让我们在 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 数组。
到目前为止,我们研究了如何从 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 模块、本地 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 中调用它。
在本节中,我们将在 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 模块。我们的程序将使用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的目录中将有一个图像,如下所示:
在本节中,我们将在 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 类。
在本节中,我们将在 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 教程。
部署基于节点的 Web 应用程序或网站是很容易的部分。确保您的 Node 实例继续为您的应用程序提供资源是事情变得更加困难的地方。如果您有兴趣确保对后端或第三方服务的请求成功,请尝试 LogRocket。
LogRocket就像一个用于网络和移动应用程序的 DVR,记录用户与您的应用程序交互时发生的所有事情。无需猜测问题发生的原因,您可以汇总和报告有问题的网络请求,以快速了解根本原因。
LogRocket 检测您的应用程序以记录基准性能时间,例如页面加载时间、第一个字节的时间、缓慢的网络请求,并记录 Redux、NgRx 和 Vuex 操作/状态。