likes
comments
collection
share

python-shell 使用详解

作者站长头像
站长
· 阅读数 66

在Node.js与Python之间搭建一座桥梁,轻松实现脚本运行、高效通信和贴心错误处理,让你的跨语言开发之旅更加顺畅愉快。

功能亮点

  • 在Node.js中稳定启动Python脚本,像个得力的助手一样为你分担任务。
  • 支持文本、JSON和二进制模式,满足你多样化的数据传输需求。
  • 自定义解析器和格式化器,让你的数据交流更加灵活自如。
  • 借助stdin和stdout流,实现Node.js与Python之间的高效对话。
  • 一旦Python脚本遇到错误,它会及时提供详细的堆栈跟踪,帮助你迅速找到问题所在。

使用前提

首先,请确保你的系统中已经安装了Python,并且能够在终端中运行python3(Mac/Linux)或python(Windows)。如果还没有安装,你可能需要将其添加到PATH中。当然,如果你想使用特定版本的Python,只需指定options.pythonPath即可。

注意,可能您并不能准确的找到需要的 python 路径,这里我做一个正确的示范,和一个错误的示范:

正确的示范

通过 python 的快捷方式找到 exe 文件的位置:

python-shell 使用详解

然后复制地址:

python-shell 使用详解

错误的示范

使用 where python3 找到的路径不一定能用,如下:

python-shell 使用详解

来到 python.exe 所在目录:

python-shell 使用详解

最后拼接得到: C:\Users\user\.windows-build-tools\python27\python.exe

到这里还不算完,因为在 node 环境中,路径不是这样写的,应改成如下形式: C:/Users/user/.windows-build-tools/python27/python.exe

安装步骤

在终端中输入以下命令,即可轻松安装python-shell

npm install python-shell

快速上手

  • 运行Python代码片段
import { PythonShell } from 'python-shell';

PythonShell.runString('x=1+1;print(x)', null).then(messages => {
  console.log('任务完成啦!');
});

如果脚本执行过程中遇到错误,它会像一个贴心的朋友一样及时告诉你。

  • 运行Python脚本文件
import { PythonShell } from 'python-shell';

PythonShell.run('my_script.py', null).then(messages => {
  console.log('脚本运行结束,一切顺利!');
});
  • 带参数和选项运行Python脚本
import { PythonShell } from 'python-shell';

let options = {
  mode: 'text', // 选择适合你的数据交换模式
  pythonPath: 'path/to/python', // 指定Python路径,更加灵活
  pythonOptions: ['-u'], // 实时获取打印结果,更加高效
  scriptPath: 'path/to/my/scripts', // 设置脚本路径,更加便捷
  args: ['value1', 'value2', 'value3'] // 向Python脚本传递参数,更加实用
};

PythonShell.run('my_script.py', options).then(messages => {
  console.log('运行结果:', messages); // 输出运行结果,一目了然
});
  • 在Node.js和Python之间愉快聊天
import { PythonShell } from 'python-shell';
let pyshell = new PythonShell('my_script.py');

pyshell.send('嗨,Python,你好吗?'); // 向Python发送问候消息

pyshell.on('message', function (message) {
  console.log('Python说:', message); // 接收并打印Python的回复消息
});

pyshell.end(function (err, code, signal) { // 结束对话并处理退出事宜
  if (err) throw err; // 如果发生错误则抛出异常
  console.log('退出代码:', code); // 输出退出代码以便了解执行情况
  console.log('退出信号:', signal); // 输出退出信号以便进一步处理
  console.log('对话结束啦!'); // 提示对话已经结束啦!
});

通过使用.send(message)方法向Python脚本发送消息,并监听message事件来接收Python的回复消息,你可以轻松实现 Node.js 与 Python 之间的实时通信。同时,你还可以根据需要使用 options.mode 来设置数据交换模式(如文本、JSON 或二进制),以满足不同的通信需求。

API 参考

PythonShell(script, options) 构造函数 创建一个 PythonShell 实例并启动 Python 进程

  • script: 要执行的脚本的路径
  • options: 执行选项,包括:
    • mode: 配置数据通过 stdin 和 stdout 流动时如何交换。可能的值有:
      • text: 数据的每一行都作为消息发送(默认)
      • json: 数据的每一行都解析为 JSON 并作为消息发送
      • binary: 数据按原样通过 stdout 和 stdin 传输
    • formatter: 要发送的每条消息都使用此方法转换,然后附加一个新行
    • parser: 数据的每一行都使用此函数解析,并将其结果作为消息发送
    • stderrParser: 日志的每一行都使用此函数解析,并将其结果作为消息发送
    • encoding: 应用于子进程流的文本编码(默认:“utf8”)
    • pythonPath: “python”可执行文件的定位路径。默认值:“python3”(Windows 下为“python”)
    • pythonOptions: 传递给“python”的选项开关数组
    • scriptPath: 查找脚本的默认路径。默认是当前工作目录。
    • args: 传递给脚本的参数数组
    • stdoutSplitter: 将 stdout 分割成块,默认为分割成由新行分隔的行
    • stderrSplitter: 将 stderr 分割成块,默认为分割成由新行分隔的行
  • 其他选项将传递给 child_process.spawn

PythonShell 实例属性

  • script: 要执行的脚本的路径
  • command: 传递给 Python 可执行文件的完整命令参数
  • stdin: Python stdin 流,用于向子进程发送数据
  • stdout: Python stdout 流,用于从子进程接收数据
  • stderr: Python stderr 流,用于通信日志和错误
  • childProcess: 通过 child_process.spawn 创建的进程实例
  • terminated: 指示进程是否已退出的布尔值
  • exitCode: 进程退出代码,在进程结束后可用
转载自:https://juejin.cn/post/7351691890382012479
评论
请登录