2016-05-04 3 views
0

Я прочитал кучу форумов и до сих пор не повезло .. У меня есть php-файл, который выполняет файл python (liveSensor.py). Он запускает файл py один раз и останавливается, как я могу держать файл открытым в фоновом режиме? Если я запускаю sudo python liveSensor.py в командной строке, он запускается только один раз, но если я нахожу sudo python -i liveSensor.py, он остается открытым. Как это сделать в php?Как сохранить постоянный скрипт python?

PHP файл -

<?php 
$try = exec('python sensor.py'); 
print_r ($try); 
?> 

В файле liveSensor.py У меня есть 2 вибрационные датчики, которые в настоящее время обнаружены и передает эту информацию в SQLite, то мой файл PHP извлекает эти данные и с помощью Ajax можно отобразить Это. Все это прекрасно работает, кроме запуска файла р постоянно ..

р сценарий -

#!/usr/bin/env python 
import RPi.GPIO as GPIO 
import time 
import sqlite3 

KnockPin = 12 
ShockPin = 13 



inning = 1 
runs = 0 
strikes = 0 
balls = 0 

print ("Welcome to Bases Loaded") 



def setstr(): 
    global strikes 
    strikes = 0 
    global balls 
    balls = 0 




def setup(): 
    GPIO.setmode(GPIO.BOARD)   
    GPIO.setup(KnockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
    GPIO.setup(ShockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 




def knock(ev=None): 

with sqlite3.connect('basesLoaded.db') as conn: 

    global strikes 
    global inning 


    strikes += 1 

    if strikes ==0: 

     pass 
    elif strikes == 1: 


     conn.execute("UPDATE bl set STRIKE = 1 WHERE ID =1"); 

     print ("Strike 1 :", conn.total_changes); 

    elif strikes == 2: 


     conn.execute("UPDATE bl set STRIKE = 2 WHERE ID=1"); 

     print ("Strike 2 :", conn.total_changes); 

    elif strikes == 3: 
     global inning 
     inning +=1 
     conn.execute("UPDATE bl set STRIKE = 0 WHERE ID=1"); 
     conn.execute("UPDATE bl set INNING = inning WHERE ID=1"); 

     print ("Strike 3 Your Out :", conn.total_changes); 
     setstr() 
     print ("Inning Number :", inning); 

def shock(ev=None): 
    with sqlite3.connect('basesLoaded.db') as conn: 

     global balls 

     balls += 1 

     if balls ==0: 
      pass 
     elif balls == 1: 

      conn.execute("UPDATE bl set BALL = 1 WHERE ID=1"); 
      conn.commit() 
      print ("Ball 1 :", conn.total_changes); 


     elif balls == 2: 

      conn.execute("UPDATE bl set BALL = 2 WHERE ID=1"); 
      conn.commit() 
      print ("Ball 2 :", conn.total_changes); 

     elif balls == 3: 

      conn.execute("UPDATE bl set BALL = 3 WHERE ID=1"); 
      conn.commit() 
      print ("Ball 3 :", conn.total_changes); 

     elif balls == 4: 

      global runs 
      runs += 1 
      conn.execute("UPDATE bl set BALL = 0 WHERE ID=1"); 
      conn.execute("UPDATE bl set RUN = 'runs' WHERE ID=1"); 
      conn.commit() 
      print ("Run Scored! score is :", runs); 
      setstr() 




def register_callbacks(): 
    GPIO.add_event_detect(ShockPin, GPIO.FALLING, callback=shock, bouncetime=2500) 
    GPIO.add_event_detect(KnockPin, GPIO.FALLING, callback=knock, bouncetime=2500) 



if __name__ == '__main__': 
    try: 
     setup() 
     register_callbacks() 

    except KeyboardInterrupt: 
     destroy() 

Это возвращает мое «Добро пожаловать в Основы Loaded» сообщение в браузере, но файл ого обыкновения оставаться открытым для обнаружения датчики.

+0

Вы должны (очевидно?) Предоставить больше информации о том, что делает liveSensor.py. – Aif

+0

python daemon: http://stackoverflow.com/search?q=python+daemon и почему вы запустили его с помощью php? –

+0

Я запускаю его с php, поскольку способ настройки игры использует мой планшет в качестве табло с кувшина кувшинов. Таким образом, используя apache2 Ican поток в моей локальной сети. Также я собираюсь в конечном итоге иметь возможность выбирать из нескольких игр, которые я буду программировать в будущем. Мне просто удобнее строить интерфейс в php/html –

ответ

0

Для такого взаимодействия вам необходимо создать серверный скрипт, который выполняется в отдельном процессе и использует протокол связи, например, базу данных. Если вы думаете об этом, среда выполнения PHP не имеет никакого контроля над скриптом python: она может запускать ее и предоставлять вам выход, но как среда выполнения PHP будет знать, когда и как вам могут понадобиться результаты из сценария?

Лучшим подходом было бы сделать службу REST с Python, которая предоставляет данные датчика по запросу, и использовать Javascript для выполнения запросов AJAX и получения данных по мере необходимости.

+0

Привет @ Cyb3rFly3r Я использую sqlite3, apache2, php5 и ajax для этого, все это отлично работает, пока я запускаю py из командной строки или в режиме ожидания. Просто не получите php, чтобы сохранить файл py открытым. –