python-shell 使用详解
在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
文件的位置:

然后复制地址:

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

来到 python.exe
所在目录:

最后拼接得到:
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