从python派生子进程接收连续输出不起作用

Rob*_* S. 0 python stdout spawn child-process node.js

我正在尝试从以python编写的秤流式传输输出。该程序(scale.py)连续运行并每半秒打印一次原始值。

import RPi.GPIO as GPIO
import time
import sys

from hx711 import HX711

def cleanAndExit():
    print "Cleaning..."
    GPIO.cleanup()
    print "Bye!"
    sys.exit()

hx = HX711(5, 6)

hx.set_reading_format("LSB", "MSB")

hx.reset()
hx.tare()

while True:
    try:
        val = hx.get_weight(5)
        print val

        hx.power_down()
        hx.power_up()
        time.sleep(0.5)
    except (KeyboardInterrupt, SystemExit):
        cleanAndExit()
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过打印一个单独的NodeJs程序(位于同一文件夹中的index.js)获取每个原始数据点print val。这是我的节点程序。

var spawn = require('child_process').spawn;
var py = spawn('python', ['scale.py']);

py.stdout.on('data', function(data){
  console.log("Data: " + data);
});

py.stderr.on('data', function(data){
  console.log("Error: " + data);
});
Run Code Online (Sandbox Code Playgroud)

当我运行时sudo node index.js,没有输出,程序将永久保存。

我的想法是print val将输出放入stdout流中,并data在节点程序中触发该事件。但是什么也没发生。

谢谢你的帮助!

nos*_*klo 6

默认情况下,所有使用libc的C程序(包括用C编写的CPython)都将在连接到管道时自动缓冲控制台输出。

一种解决方案是每次需要时刷新输出缓冲区:

print val
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用带有-u标志的python 强制将其取消缓冲:

var py = spawn('python', ['-u', 'scale.py']);
Run Code Online (Sandbox Code Playgroud)