在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

+0

谢谢你的建议。事实证明,我试图做的似乎并不是那么普遍。无论如何,塞内卡似乎是一个很好的系统,即使不是这个项目,也可能适用于我的其他几个人。出于绝望,我最终使用Python的stdout流来简单地将数据打印到节点,然后使用节点的服务器功能在浏览器中显示数据。我能够将数据从浏览器返回给Node,但不能将它发送给Python(stdin流更加快捷,如果没有我发送EOF,我就无法工作)。 – Dewey