You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Lua后台执行Python脚本失败问题求助

解决Lua后台调用Python LED脚本的异常问题

看起来你是在用Lua脚本(大概率是Telegram Bot这类场景)触发Python的LED控制脚本时遇到了异常,我帮你梳理下问题点和可行的解决方案:

先贴出你的代码方便参考:

你的Lua代码

function on_msg_receive (msg) 
  if (msg.text=="Alarmon") then 
    send_msg (msg.from.print_name, 'Sensor ON!', ok_cb, false) 
    io.popen('/home/pi/led.py') 
  end 
end

你的Python代码

import RPi.GPIO as GPIO 
import time 
pinn=4 
GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 
GPIO.setup(pinn,GPIO.OUT) 
print "LED on" 
GPIO.output(pinn,GPIO.HIGH) 
time.sleep(5) 
print "LED off" 
GPIO.output(pinn,GPIO.LOW) 
GPIO.cleanup()

问题分析与解决方案

我之前帮朋友排查过类似的树莓派GPIO控制问题,大概率是这几个原因导致的异常:

  1. io.popen未正确处理进程资源
    io.popen会创建管道连接到子进程的输出,但如果不读取输出或关闭句柄,子进程可能会因为输出缓冲区满而阻塞,甚至引发资源泄漏。你可以修改Lua代码,手动处理进程输出并关闭句柄:
function on_msg_receive (msg) 
  if (msg.text=="Alarmon") then 
    send_msg (msg.from.print_name, 'Sensor ON!', ok_cb, false) 
    -- 打开进程并读取所有输出
    local proc = io.popen('/home/pi/led.py')
    local output = proc:read("*a")
    proc:close() -- 必须关闭句柄释放系统资源
  end 
end
  1. Python脚本缺少可执行权限或Shebang
    确保你的Python脚本能被直接执行:
  • led.py的最顶部添加Shebang(根据你的Python版本调整:Python2用#!/usr/bin/env python,Python3用#!/usr/bin/env python3
  • 给脚本添加可执行权限:
chmod +x /home/pi/led.py
  1. 权限不足无法操作GPIO
    运行Lua脚本的用户(比如Telegram Bot的运行用户)可能没有操作GPIO的权限,把该用户加入gpio组即可:
sudo usermod -aG gpio 你的用户名
  1. 替代方案:用os.execute代替io.popen
    如果不需要获取Python脚本的输出,用os.execute会更简单,它会自动处理进程的生命周期:
function on_msg_receive (msg) 
  if (msg.text=="Alarmon") then 
    send_msg (msg.from.print_name, 'Sensor ON!', ok_cb, false) 
    -- 加&让脚本后台运行,不加的话会等待5秒脚本执行完再继续
    os.execute('/home/pi/led.py &') 
  end 
end

你可以按顺序排查这些点,应该能解决异常问题。

内容的提问来源于stack exchange,提问作者eonmax

火山引擎 最新活动