我是node和socket.io的新手。我有一个nodejs服务器,我试图用它来生成Python进程,并从网页传递数据。在Python端,我试图使用Python的stdin / stdout管道。
从Python到nodejs以及服务器的所有功能都可以正常工作。但是,当我尝试使用stdin.write将数据从nodejs传递回Python时,节点崩溃,并且#34;结束后写入"错误。我想知道我用来接收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
});
IN 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
答案 0 :(得分:0)
如果你想组合node和python,我认为最好的解决方案是使用Seneca.JS转向微服务架构。如果我在你身边,我将创建一个休息接口,以便在python进程和node.js微服务之间进行通信。您可以找到更多信息here
答案 1 :(得分:0)
删除py.stdin.end()。 并确保'\ n'在stringify之外
py.stdin.write(JSON.stringify(data.browser_value)+'\n');