Lua 执行后台的 Python 脚本

我有一个问题需要在后台运行脚本。

我有一个 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()

执行后我得到了下面的结果:

/home/pi/led.py: 1: /home/pi/led.py: import: not found
/home/pi/led.py: 2: /home/pi/led.py: import: not found
/home/pi/led.py: 4: /home/pi/led.py: Syntax error: word unexpected (expecting ")")

这是一个用于与 Telegram 通信的 Lua 文件,我发送消息 "Alarmon" 后就可以工作,直到出现错误。 我认为问题在于 io.popen 没有在 Python 中运行 led.py。 怎么改变它呢?

点赞
用户2858170
用户2858170

在您的代码中,您只给io.popen提供了一个 Python 脚本的路径。

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

您的计算机不知道该做什么。

Lua 5.3 参考手册中:

io.popen (prog [, mode])

这个函数是与系统相关的,不是所有平台都可用的。

在一个独立的进程中启动程序 prog,并返回一个文件句柄,您可以使用它来从此程序读取数据(如果 mode 是 "r",那是默认值),或将数据写入此程序(如果 mode 是 "w")。

因此,为了使其工作,您必须实际启动一个程序,而在您的情况下是 Python 解释器。 如果您的系统路径变量中有 Python 解释器的位置,则应该可以正常工作:

io.popen('Python')

然后,您还需要提供脚本的路径作为参数,让解释器运行脚本。

io.popen('Python /home/pi/led.py')

这与您在命令行界面中输入的相同...

如果您不打算使用任何程序的输入或输出,只需使用:

os.execute('Python /home/pi/led.py')

即可。

2018-04-23 08:32:02