Node.js和Python之间的数据交换

3
我刚接触node和socket.io。我有一个nodejs服务器,我试图使用它来生成Python进程并在网页之间传递数据。在Python端,我尝试使用Python的标准输入输出管道。

从Python到nodejs再到服务器上的所有内容都正常工作。但是,当我尝试使用stdin.write将数据从nodejs发送回Python时,node会崩溃并显示“write after end”错误。我想知道我用于接收Python信息的socket是否与我尝试发送的socket发生了冲突。我正在使用计时器每秒向网页发送数据。

这似乎与Python在调用sys.stdin.readlines()时期望EOF有关,但是当我从nodejs使用stdin.end()时,就会出现错误。有趣的是,如果我从未调用stdin.end,则不会出现错误,但我也不会收到任何消息。

非常感谢任何帮助。恐怕我不太了解socket.io,在这里看不出什么问题。谢谢。

在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中:

发送到Node.js:

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
2个回答

0

如果你想结合Node和Python,我认为最好的解决方案是使用Seneca.JS进行微服务架构。如果我是你,我会创建一个REST接口来在Python进程和Node.js微服务之间进行通信。你可以在这里找到更多信息。


感谢您的推荐。结果发现我想做的事情似乎并不是很普遍。无论如何,Seneca 看起来是一个非常棒的系统,如果不是为了这个项目,也可以用于我有的其他几个项目。最终,我绝望地使用了 Python 的 stdout 流来简单地将数据打印到节点,然后使用节点的服务器功能在浏览器中显示数据。我能够从浏览器返回数据到 Node,但无法将其发送到 Python(stdin 流更加棘手,除非我发送 EOF,否则它不会响应,而我无法让它正常工作)。 - Dewey

0

移除 py.stdin.end()。 并确保 '\n' 在 stringify 外部。

py.stdin.write(JSON.stringify(data.browser_value)+'\n');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接