Python子进程无法持续接收称重秤程序输出问题求助
解决Python子进程捕获称重秤程序持续输出的问题
我来帮你搞定这个子进程捕获持续输出的问题!核心问题大概率是标准输出缓冲在搞鬼——默认情况下Python会缓冲stdout的内容,不会实时把打印的内容传给父进程,导致你看不到持续输出。下面给你两种可行的解决方案:
方案一:修改称重秤程序(scale.py)强制刷新输出
既然你的scale.py是Python2语法(看print语句没有括号),直接在每次print后手动刷新stdout,确保内容实时输出:
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 sys.stdout.flush() # 关键:强制刷新输出缓冲区 hx.power_down() hx.power_up() time.sleep(0.5) except (KeyboardInterrupt, SystemExit): # 补全异常捕获,确保能正常退出 cleanAndExit() except Exception as e: print "Error:", e sys.stdout.flush()
方案二:在父进程中配置无缓冲的子进程读取
如果不想修改scale.py,也可以在调用子进程时通过subprocess模块设置无缓冲模式,确保实时读取输出:
import subprocess import sys def capture_scale_output(): # 启动子进程,bufsize=0设置无缓冲(Python2适用) proc = subprocess.Popen( ['python', 'scale.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 把stderr也重定向过来,方便看错误 bufsize=0, close_fds=True ) # 循环读取每一行输出,直到子进程结束 for line in iter(proc.stdout.readline, b''): line = line.strip() if not line: continue try: # 尝试转换为数值(如果是重量值) weight = float(line) print "Received weight:", weight except ValueError: # 处理非数值的日志(比如清理信息) print "Scale log:", line proc.wait() if __name__ == "__main__": try: capture_scale_output() except KeyboardInterrupt: print "Stopping capture..."
关键知识点解释
- 输出缓冲:Python默认会把stdout的内容攒到一定量才输出,尤其是管道通信时更明显,手动刷新或者设置无缓冲就能解决实时输出的问题。
- 子进程读取:用
iter(proc.stdout.readline, b'')是高效的逐行读取方式,避免阻塞等待整个输出结束。
内容的提问来源于stack exchange,提问作者Rob S.
相关产品推荐
相关产品推荐

