Выполнить Python скрипт из PHP и оставить скрипт открытым - PullRequest
1 голос
/ 06 апреля 2020

Я создаю проект на Raspberry Pi, используя детектор движения для отправки текстового сообщения. Возникли некоторые проблемы при выполнении сценария python из PHP (Apache2).

Попытка выполнить этот сценарий python:

#!/usr/bin/env python
from gpiozero import MotionSensor
import time
import os
#Motion sensor in GPIO23
ms = MotionSensor(23)

def send_notification():
    #Debug Motion Statement
    print("There was a movement!")

    #Notification script is stored in notification variable
    notification = os.popen ('bash /home/pi/project/notification.sh')

    #Send Notification
    print(notification.read())

    #Delay between notifications
    time.sleep(15)

#Execute send_notification function on motion
ms.when_motion = send_notification

Уведомление. sh сценарий для справки , Для отправки текстового сообщения используется постфикс.

echo "Motion was detected in your Smart Mailbox!" | mail myphonenumber@vtext.com

Из этого PHP кода:

<!DOCTYPE html>
<html>

<head>
    <title>Smart Mailbox</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>

<div class="form-style-5">
    <body style="text-align:center;">
        <h1>Smart Mailbox Application</h1>
        <p>Enter Your Phone Number:</p>
        <form method="post">
            <input type="tel" name="phonenumber" placeholder="10 Digit Phone Number" pattern="[0-9]{10}" required>
            <br>
            <p>Select Your Phone Carrier:</p>
            <select name="carrierdropdown" required>
                <option value=""></option>
                <option value="Verizon">Verizon</option>
                <option value="ATT">ATT</option>
                <option value="Sprint">Sprint</option>
                <option value="TMobile">T-Mobile</option>
            </select>
            <br><br>
            <input type="submit" name="submit" value="Start SmartMailbox">
        </form>

    </body>
</div>

</html>

<?php

    if(isset($_POST['submit'])) {
        //Appends phone carrier address to email address
            if($_POST['carrierdropdown']=="Verizon"){
                //echo "DEBUG:Verizon";
                $carrier = "@vtext.com";
            } elseif ($_POST['carrierdropdown']=="ATT"){
                //echo "DEBUG:ATT";
                $carrier = "@txt.att.net";
            } elseif ($_POST['carrierdropdown']=="Sprint"){
                //echo "DEBUG:Sprint";
                $carrier = "@messaging.sprintpcs.com";
            } elseif ($_POST['carrierdropdown']=="TMobile"){
                //echo "DEBUG:T-Mobile";
            } else{
                echo "Break";
            }

        //Gets users phone number from HTML form
        $phonenumber = $_POST['phonenumber'];

        //Opens notification script for editing
        $file = fopen('/var/www/html/notification.sh','w');

        //Writes mail command to file appending phonenumber
        fwrite($file,'echo "Motion was detected in your Smart Mailbox!" | mail ' . $phonenumber . $carrier);

        //Closes file
        fclose($file);

        //Runs python scripts
        exec('node /home/pi/project/blynkconnect.js');
        exec('python -i /home/pi/project/MotionNotification.py &');

    }
?>

Следующая команда работает только в командной строке. Мне нужно использовать флаг -i, чтобы сеанс оставался открытым для обнаружения движения.

python -i /home/pi/project/MotionNotification.py &

Поэтому я полагаю, что моя проблема запускается с PHP (я использую веб-сервер apache2 для хостинга) , Все файлы имеют права на чтение, запись, выполнение. Команда узла, с которой я запускаю PHP, работает без сбоев. Я пытался предоставить apache веб-пользователю root доступ, но все равно не повезло.

Есть идеи, которые я могу попробовать? Спасибо!

...