2017-04-06 111 views
1

我是新來的節點和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 

回答

0

如果要合併節點和Python我認爲最好的辦法是將移動到微服務架構使用Seneca.JS。如果我在你身邊,我將創建一個休息界面來在python進程和node.js微服務之間進行通信。你可以找到更多的信息here

+0

謝謝你的建議。事實證明,我試圖做的似乎並不是那麼普遍。無論如何,塞內卡似乎是一個很好的系統,即使不是這個項目,也可能適用於我的其他幾個人。出於絕望,我最終使用Python的stdout流來簡單地將數據打印到節點,然後使用節點的服務器功能在瀏覽器中顯示數據。我能夠將數據從瀏覽器返回給Node,但不能將它發送給Python(stdin流更加快捷,如果沒有我發送EOF,我就無法工作)。 – Dewey