📜  使用子进程 spawn() 方法从 Node.js 运行Python脚本(1)

📅  最后修改于: 2023-12-03 15:22:23.608000             🧑  作者: Mango

使用子进程 spawn() 方法从 Node.js 运行 Python 脚本

在 Node.js 中,我们可以使用子进程模块中的 spawn() 方法来运行其它命令行程序,包括 Python 脚本。

spawn() 方法

spawn() 方法会返回一个新的子进程对象,可用于与子进程进行通信。这个方法接收两个参数:

  1. 要运行的命令行程序的名称或路径(包括可执行文件、脚本文件等)
  2. 一个可选的参数数组,用于传递命令行参数
const { spawn } = require('child_process');
const child = spawn('python', ['myScript.py']);
传递参数

如果子进程需要接收参数,可以在第二个参数数组中将参数以字符串的形式依次列出。

比如,我们要运行名为 myScript.py 的 Python 脚本,并向该脚本传递一个参数 myArg,可以这样:

const { spawn } = require('child_process');
const child = spawn('python', ['myScript.py', 'myArg']);

在 Python 脚本中,可以通过 sys.argv 来获取传递的参数:

import sys

print(sys.argv)
# ['myScript.py', 'myArg']
捕获子进程的输出

当子进程开始运行时,它会产生输出,包括标准输出和标准错误输出。我们可以通过 child.stdoutchild.stderr 来分别捕获这两种输出流,并以事件的形式处理它们的数据。

const { spawn } = require('child_process');
const child = spawn('python', ['myScript.py']);

child.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

在 Python 脚本中,我们可以使用 print() 来输出数据,它们会被发送到标准输出流中。

捕获子进程的错误

如果子进程启动失败,会抛出一个错误。我们可以通过捕获 error 事件来处理这些错误。

const { spawn } = require('child_process');
const child = spawn('python', ['myScript.py']);

child.on('error', (error) => {
  console.error(`Failed to start subprocess: ${error}`);
});

如果子进程运行过程中产生错误,可以通过捕获 close 事件来获取错误码。

const { spawn } = require('child_process');
const child = spawn('python', ['myScript.py']);

child.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

在 Python 脚本中,我们可以使用 sys.exit(n) 来以指定的错误码退出。

注意事项
  1. 在 Windows 中,.py 文件可能不会自动与 Python 解释器关联,需要在命令行中手动输入 python myScript.py 来执行 Python 脚本。

  2. 在使用 spawn() 方法运行命令时,如果需要等待子进程执行完毕后再继续执行当前代码,则需要使用 child_process.execSync()child_process.exec() 方法。这两个方法都可以等待子进程执行完毕后再返回。

参考资料
  1. Node.js 子进程文档
  2. Python subprocess 文档