Python脚本读取subprocess.communicate()返回值问题及LED控制需求
解决mpc播放状态控制LED的返回值问题
我来帮你搞定这个LED控制的问题!核心问题出在你处理subprocess返回值的方式上,默认返回的是字节串,而且grep的输出可能带换行符,导致你的状态判断永远不生效。下面是修复后的完整方案:
问题根源分析
你原来的代码里,process.communicate()[0]返回的是字节类型(比如b'playing\n'),而你在和字符串"playing"做比较,肯定匹配不上;另外用grep解析mpc status的输出也不够可靠,万一mpc的输出格式变化,grep就会失效。
修复后的完整代码
#!/usr/bin/env python import RPi.GPIO as GPIO import time import subprocess ledpin = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(ledpin, GPIO.OUT) try: while True: # 直接用mpc的参数获取播放状态,比grep更可靠 # %state% 会返回 playing/paused/stop 三种状态 result = subprocess.run( ["mpc", "current", "-f", "%state%"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # 直接返回字符串,无需手动decode ) playback_state = result.stdout.strip() # 去掉换行和首尾空格 # 根据状态控制LED if playback_state == "playing": GPIO.output(ledpin, GPIO.HIGH) else: # 暂停/停止时熄灭LED GPIO.output(ledpin, GPIO.LOW) # 每秒检查一次状态,避免占用过多CPU time.sleep(1) finally: # 程序退出时务必清理GPIO,防止引脚状态异常 GPIO.cleanup()
关键改进点
- 更可靠的状态获取:用
mpc current -f %state%直接获取播放状态,避免依赖grep解析复杂输出,状态值只会是playing/paused/stop,判断更准确 - 正确的返回值处理:
text=True让subprocess.run直接返回字符串,strip()去掉多余的换行和空格,确保状态值干净 - GPIO安全清理:
finally块保证不管程序正常退出还是意外中断,都会重置GPIO引脚状态,避免LED一直亮着 - 降低资源占用:
time.sleep(1)让循环每秒执行一次,不会让CPU跑满
额外注意事项
- 确保你的树莓派已经安装了
mpc和mpd服务,并且mpd处于运行状态 - 运行脚本时可能需要sudo权限(因为要控制GPIO):
sudo python3 your_script.py - 如果需要区分暂停和停止状态,可以单独判断
playback_state == "paused"或playback_state == "stop",再做对应处理
内容的提问来源于stack exchange,提问作者Cary C
相关产品推荐
相关产品推荐

