从 python spawn 子进程接收连续输出不工作
Receiving contiinuous output from python spawn child process not working
我正在尝试从 python 中编写的体重秤流式传输输出。该程序 (scale.py) 运行s 连续并每半秒打印一次原始值。
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()
我正在尝试在由 print val
打印的单独 NodeJs 程序(index.js 位于同一文件夹中)中获取每个原始数据点。这是我的节点程序。
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);
});
当我 运行 sudo node index.js
时没有输出,程序会一直等待。
我的想法是 print val
应该将输出放入标准输出流,这应该会触发节点程序中的 data
事件。但是什么也没有发生。
感谢您的帮助!
默认情况下,所有使用 libc 的 C 程序(包括 CPython,因为它是用 C 编写的)在连接到管道时会自动缓冲控制台输出。
一种解决方案是每次需要时刷新输出缓冲区:
print val
sys.stdout.flush()
另一种解决方案是使用 -u
标志调用 python,强制它不被缓冲:
var py = spawn('python', ['-u', 'scale.py']);
我正在尝试从 python 中编写的体重秤流式传输输出。该程序 (scale.py) 运行s 连续并每半秒打印一次原始值。
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()
我正在尝试在由 print val
打印的单独 NodeJs 程序(index.js 位于同一文件夹中)中获取每个原始数据点。这是我的节点程序。
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);
});
当我 运行 sudo node index.js
时没有输出,程序会一直等待。
我的想法是 print val
应该将输出放入标准输出流,这应该会触发节点程序中的 data
事件。但是什么也没有发生。
感谢您的帮助!
默认情况下,所有使用 libc 的 C 程序(包括 CPython,因为它是用 C 编写的)在连接到管道时会自动缓冲控制台输出。
一种解决方案是每次需要时刷新输出缓冲区:
print val
sys.stdout.flush()
另一种解决方案是使用 -u
标志调用 python,强制它不被缓冲:
var py = spawn('python', ['-u', 'scale.py']);