S

Snake In The JS Shadow:在 nodeJs 中运行你的 Python 脚本

2025-06-08

Snake In The JS Shadow:在 nodeJs 中运行你的 Python 脚本

封面图片来源于此处

有没有想过,在 Node.js 代码中是否可以运行 Python 函数?我也有同样的疑问,于是研究了一下,发现 Node.js 中有一个child_process模块,允许你运行子进程。你可能想知道什么是子进程,根据维基百科,

计算机中的子进程是指由另一个进程创建的进程。这种技术适用于多任务操作系统,有时也称为子进程,或传统意义上的子任务。创建子进程主要有两个步骤:fork 系统调用和 spawn 系统调用。

我将尝试引导您如何在 nodejs 代码中运行非阻塞 python 脚本。

必备品

显然,你的机器上必须安装 Node.js。之后,你需要导入 fs 模块。
另外,因为我想在浏览器中显示结果,所以我们使用 Express 来提供服务。

npm install express

设置

创建两个文件,index.jsmain.py,将以下代码添加到 index.js 文件中

const { spawn } = require('child_process');
const express = require("express");
const app = express();
Enter fullscreen mode Exit fullscreen mode

在main.py文件中,添加以下代码

print('Hello')
Enter fullscreen mode Exit fullscreen mode

hr.png

主要实现

在 index.js 文件中,添加以下内容

const pythonPromise = () => {
  return new Promise((resolve, reject) => {
    const python = spawn("python", ["./main.py"]);
    python.stdout.on("data", (data) => {
      resolve(data.toString());
    });

    python.stderr.on("data", (data) => {
      reject(data.toString());
    });
 });
};
app.get("/:name", async (req, res) => {
  const dataFromPython = await pythonPromise();
  res.send(dataFromPython + req.params.name);
});
app.listen(3200, () => console.log("App is running port 3200"));
Enter fullscreen mode Exit fullscreen mode

这里的 spawn 函数接受两个参数,第一个参数"python"是我们要运行的程序,第二"./main"个参数是我们要运行的 Python 文件的路径。
我们都知道 Node.js 是事件驱动的,我们监听的两个事件是python.stdout.onpython.stderr.onstderr是标准错误的缩写,它在尝试运行 Python 脚本时发生;stdout是标准输出的缩写,它是脚本的返回值。返回的数据类型是二进制,因此需要调用该toString()方法将其转换为字符串。

启动服务器node index.js,然后在浏览器或 Postman 中访问http://localhost:3200/yourName以查看结果。 如果我们不向 Python 脚本传递参数,那么实际上就没有必要使用 Python 脚本了。让我们编辑main.py文件,使其包含一个从 Node.js 代码中获取参数的函数。将其替换为:
hr.png

import sys
print('Hello ' + sys.argv[1] + ' your id is ' + sys.argv[2])
Enter fullscreen mode Exit fullscreen mode

此外,我们向 spawn 函数添加更多参数,我们的 index.js 文件应如下所示:

const pythonPromise = (data) => {
  return new Promise((resolve, reject) => {
    const python = spawn("python", ["./main.py", ...data]);

    python.stdout.on("data", (data) => {
      resolve(data.toString());
    });

    python.stderr.on("data", (data) => {
      reject(data.toString());
    });
  });
};

app.get("/:name/:id", async (req, res) => {
  const { name, id } = req.params;
  const dataFromPython = await pythonPromise([name, id]);
  res.send(dataFromPython);
});
app.listen(3200, () => console.log("App is running port 3200"));
Enter fullscreen mode Exit fullscreen mode

你可能想知道我们在 main.py 脚本中导入的 sys 模块是什么。根据geeksforgeeks的说法,

sys 模块提供了用于操作 Python 运行时环境不同部分的函数和变量。该模块提供对解释器使用或维护的一些变量以及与解释器密切交互的函数的访问。

索引 argv[1] 和 argv[2] 是我们希望传递给脚本的参数。第一个参数 argr[0] 是我们正在运行脚本的文件名。
启动服务器node index.js,然后在浏览器或 Postman 中访问http://localhost:3200/yourName/anyId即可查看结果。

hr.png

这是一个非常基础的示例,旨在向您展示 child_process 模块的 spawn 方法的强大功能。可能会出现一些复杂的情况,例如将 JSON 对象传递给 Python 脚本或从脚本接收 JSON 数据,但这应该可以帮助您在 Node.js 应用程序中运行 Python 脚本。✌🏻

鏂囩珷鏉ユ簮锛�https://dev.to/addempsea/snake-in-the-js-shadow-run-your-python-script-in-nodejs-im8
PREV
使用 Lighthouse 揭示 JavaScript 性能
NEXT
使用 React 从 JSON 自动生成表单