我有两个脚本 - 一个是python脚本,另一个是节点脚本。 python脚本在infinte循环中运行并读取串行数据。收到串行数据后,必须将其传递给node.js scipt,以便在节点服务器中处理。
我想过使用node.js child_process模块从python脚本中读取数据,但由于python脚本是无限循环,因此它不会将任何数据返回给节点脚本。 谁能告诉我如何解决这个问题?
Python脚本:
import serial
ser = serial.Serial('COM10', 9600, timeout =1)
while 1 :
print ser.readline()'
Node.js脚本:
var spawn = require('child_process').spawn,
ls = spawn('python',['pyserial.py']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
注意:我使用python脚本的唯一原因是node.js由于serialport模块中的某些问题,串口模块目前无法用于我的项目。
答案 0 :(得分:8)
打印后需要在python脚本中刷新标准输出流。这是打印时间的示例(我没有要测试的串行设备):
的Python:
import sys
from datetime import datetime
from time import sleep
while 1:
print datetime.now()
sys.stdout.flush()
sleep(5)
Node.js的:
var spawn = require('child_process').spawn,
ls = spawn('python',['test.py']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
答案 1 :(得分:2)
使用-u
python命令行开关。它会告诉python使用无缓冲的流。
var spawn = require('child_process').spawn,
ls = spawn('python',['-u', 'pyserial.py']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});