如何从python脚本动态输出到PHP?

时间:2017-02-06 16:10:47

标签: php python

我正在使用PIR传感器连接我的树莓派......我编写了Python脚本来获取传感器的输入...现在我希望PHP中的python脚本的输出在我的网站中进一步操作...我试过了以下代码:这是PHP代码:

<?php    
    $output=shell_exec('python/sense1.py');
    echo $output;
?>

这是Python代码:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
PIR_PIN = 26
GPIO.setup(PIR_PIN, GPIO.IN)
while True:
    time.sleep(1)
    if GPIO.input(PIR_PIN):
        print ("Human Moving")
    else:
        print ("No human moving")

我在python中尝试了单个print语句并在PHP中获得了输出...但是现在问题是Python脚本每1秒无限地返回输出...所以我无法从python脚本获取输出(无限循环的becoz)...但是我希望每秒输出一次来检查PIR传感器的状态......我怎么能这样做?请帮帮我...

2 个答案:

答案 0 :(得分:0)

我正在使用Raspberry PI的温度传感器做类似的事情。 我通过调用我使用python flask创建的REST API来有争议地获得房间的温度水平。

这里我在做什么(您只需要用传感器代码替换温度传感器代码)

我的python烧瓶代码:

@app.route('/room-temp') //This is my get rest endpoint, i call from php
@requires_auth  //You dont need authentication, so you should remove this
def room_temp():
    pi = pigpio.pi()
    pigpio.exceptions = False
    c, files = pi.file_list("/sys/bus/w1/devices/28-00*/w1_slave")
    pigpio.exceptions = True
    if c >= 0:
       for sensor in files[:-1].split("\n"):
          devid = sensor.split("/")[5] # Fifth field is the device Id.

          h = pi.file_open(sensor, pigpio.FILE_READ)
          c, data = pi.file_read(h, 1000) # 1000 is plenty to read full file.
          pi.file_close(h)

          if "YES" in data:
             #gc.collect()
             (discard, sep, reading) = data.partition(' t=')
             t = float(reading) / 1000.0
             #print("{} {:.1f}".format(devid, t))
             data5 = {'temp':"{} {:.1f}".format(devid, t)}
             pi.stop()
             return jsonify(data5)
          else:
             #print("999.9")
             #gc.collect()
             data6 = {'temp':"999.9"}
             return jsonify(data6)

我正在我的Raspberry中运行这个烧瓶api,我从我的PHP应用程序进行ajax调用。我从PHP中对http://raspberryip:port/room-temp进行AJAX调用。

注意:您需要查看REST,使用Python Flask(Link)的REST和来自PHP的AJAX。

这是从传感器获取结果的非常简单的方法,但问题是需要几毫秒才能将AJAX请求发送到用python烧瓶编写的REST端点。因此,您需要通过连续运行python脚本将每个传感器活动存储到本地数据库,并且您可以从该轻量级数据库中获取值。从Raspberry获取后,您可以从Raspberry中删除记录以忽略开销。
适用于传感器上的所有活动。
我的建议:请将传感器结果存储到本地数据库,然后编写REST端点以从DB获取记录。将您的AJAX调用从您的PHP应用程序放到该REST端点,以从该Raspberry的本地数据库获取数据。

答案 1 :(得分:-2)

在你的python脚本中,你应该将传感器值写在文本文件上(而不是显示它)并在循环中用php读取它。

或者只是从python脚本中删除循环。然后,当你启动你的python脚本时,它只会输出一个值,你将在php中执行你的脚本。问题是PHP将生成一次页面而不重新加载值。然后,您可以每秒重新加载页面以实现该值。