2014-09-01 64 views
2

我是新來的node.js和socket.io,我試圖編寫一個小型服務器,將更新基於python輸出的網頁。Node.js的Python子腳本輸出完成,而不是實時

這最終將被用於溫度傳感器,所以現在我有一個打印每隔幾秒鐘溫度值的虛設腳本:

Thermostat.py

import random, time 
for x in range(10): 
    print(str(random.randint(23,28))+" C") 
    time.sleep(random.uniform(0.4,5)) 

這裏有一個減少版服務器:

Index.js

var sys = require('sys'), 
    spawn = require('child_process').spawn, 
    thermostat = spawn('python', ["thermostat.py"]), 
    app = require('express')(), 
    http = require('http').Server(app), 
    io = require('socket.io')(http); 

thermostat.stdout.on('data', function (output) { 
    var temp = String(output); 
    console.log(temp); 
    io.sockets.emit('temp-update', { data: temp}); 
}); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
    }); 

最後的網頁:

的Index.html

<!doctype html> 
<html> 
    <head> 
     <title>Live temperature</title> 
     <link rel="stylesheet" type="text/css" href="styles.css"> 
    </head> 
    <body> 
    <div id="liveTemp">Loading...</div> 

    <script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io(); 
     socket.on('temp-update', function (msg) { 
     $('#liveTemp').html(msg.data) 
    }); 
    </script> 

    </body> 
</html> 

的問題是似乎的NodeJS對收到的所有溫度值的同時,和而不是在隨機獲得10個溫度值間隔,我得到所有的值在一個長字符串中的腳本完成後:

lots of temp values console output

回答

5

您需要在python中禁用輸出緩衝。這可以通過許多不同的方式,包括:

  • 設置PYTHONUNBUFFERED環境變量
  • 薪火-u開關Python可執行
  • (你的情況或print())每次調用寫後sys.stdout.flush()到stdout
  • 對於Python 3.3+,您可以通過flush=trueprint()print('Hello World!', flush=True)

此外,在您的節點代碼中(即使您已在Python代碼中進行了睡眠,並且現在正在刷新標準輸出),您真的不應該認爲thermostat.stdout的「數據」處理程序中的output始終只是一行。

+0

sys.stdout.flush()做到了! – mbdavis 2014-09-06 13:11:45