如何使用python-shell实现Node与常驻Python的stdin/stdout双向通信
实现步骤
1. 安装依赖
在Node项目目录下执行安装命令:
npm install python-shell
2. 编写Node侧代码(app.js)
const { PythonShell } = require('python-shell'); // 初始化Python常驻进程 let pyshell = new PythonShell('test.py', { pythonPath: 'python3' // Windows环境可修改为'python' }); // 监听Python返回的消息,自动解析JSON格式返回内容 pyshell.on('message', (message) => { console.log('收到Python返回数据:', message); }); // 监听进程报错 pyshell.on('error', (err) => { console.error('Python进程异常:', err); }); // 监听进程退出 pyshell.on('close', (code) => { console.log('Python进程退出,退出码:', code); }); // 向Python发送测试字符串 const sendStr = "12345:2 analogInput 2"; console.log('向Python发送数据:', sendStr); pyshell.send(sendStr); // 支持多次发送消息,示例为间隔2秒发送第二条测试数据 setTimeout(() => { pyshell.send("第二条测试数据"); }, 2000); // 如需手动关闭Python进程可调用以下方法 // pyshell.end((err) => { // if (err) throw err; // console.log('Python进程已手动关闭'); // });
3. 编写Python侧代码(test.py)
import sys import json def process_input(input_str): # 可替换为自定义业务处理逻辑 parts = input_str.strip().split() resp = { "Response": "Success", "OriginalInput": input_str, "ParsedData": { "address": parts[0] if len(parts) > 0 else "", "object_type": parts[1] if len(parts) > 1 else "", "object_instance": parts[2] if len(parts) > 2 else "" } } return resp if __name__ == "__main__": # 循环监听stdin输入,保持进程常驻 for line in sys.stdin: input_str = line.strip() result = process_input(input_str) # 输出JSON格式结果,每行对应一次返回 print(json.dumps(result)) # 强制刷新缓冲区,避免数据滞留不发送 sys.stdout.flush()
运行测试
在项目目录执行node app,控制台会依次打印发送的内容和Python返回的处理结果。
注意事项
- 每次
pyshell.send()发送的内容不要携带换行符,避免Python侧拆包错误 - 如需传输结构化数据,可在Node侧将对象转成JSON字符串发送,Python侧收到后直接解析即可
- 大流量传输场景建议给每次传输内容添加自定义结束标记,避免粘包问题
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

