在nodejs和Python之间交换数据
问题描述:
我是新来的节点和socket.io。我有一个nodejs服务器,我正尝试使用它来产生一个Python进程,并将数据传递给网页和从网页传递数据。在Python端,我试图使用Python的stdin/stdout管道。在nodejs和Python之间交换数据
从Python到nodejs和到服务器的一切工作正常。但是,当我尝试使用stdin.write将数据从nodejs传递回Python时,节点崩溃时出现“write after end”错误。我想知道如果我用来从Python接收的套接字与我试图发回的套接字发生冲突。我正在使用计时器每秒钟将数据发送到网页。
这似乎与Python在调用sys.stdin.readlines()时期待EOF有关,但是,当我从nodejs使用stdin.end()时,那是在出现错误时。有趣的是,如果我从来不打电话stdin.end,我没有得到错误,但我也没有收到任何东西。
任何帮助,非常感谢。恐怕我对socket.io不够了解,看看这里出了什么问题。谢谢。
IN的NodeJS: 产卵Python的过程:
var util = require('util'),
spawn = require('child_process').spawn,
py = spawn('python', ['data_collect.py']);
从Python中接收数据:
py.stdout.on('data', function(data){
python_output = data.toString();
将数据发送到浏览器:
var listener = io.listen(server);
listener.sockets.on('connection', function (socket) {
socket.emit('dataPacket1', {variable_1: data1});
socket.emit('dataPacket2', {variable_2: data2});
socket.emit('dataPacket3', {variable_3: data3});
}, 1000);
从浏览器接收和发送到Python:
socket.on('messageFromBrowser', function(data) {
py.stdin.setEncoding('utf-8');
py.stdin.write(JSON.stringify(data.browser_value+'\n'));
py.stdin.end(); <--- Error happens here
});
在Python: 发送到的NodeJS:
output = "dataout"
sys.stdout.write(output)
sys.stdout.flush()
从的NodeJS接收:
lines = []
while True:
line = sys.stdin.readline()
if line !='':
lines.append(line)
else:
break
return lines
答
如果要合并节点和Python我认为最好的办法是将移动到微服务架构使用Seneca.JS。如果我在你身边,我将创建一个休息界面来在python进程和node.js微服务之间进行通信。你可以找到更多的信息here
谢谢你的建议。事实证明,我试图做的似乎并不是那么普遍。无论如何,塞内卡似乎是一个很好的系统,即使不是这个项目,也可能适用于我的其他几个人。出于绝望,我最终使用Python的stdout流来简单地将数据打印到节点,然后使用节点的服务器功能在浏览器中显示数据。我能够将数据从浏览器返回给Node,但不能将它发送给Python(stdin流更加快捷,如果没有我发送EOF,我就无法工作)。 – Dewey