2016-05-04 6 views
0

Ich habe eine Reihe von Foren gelesen und immer noch kein Glück .. Ich habe eine PHP-Datei, die eine Python-Datei (liveSensor.py) ausführt. Es startet die Py-Datei einmal und stoppt, wie kann ich die Datei im Hintergrund offen halten? Wenn ich sudo python liveSensor.py in der Kommandozeile starte, läuft es auch nur einmal, aber wenn ich sudo python -i liveSensor.py setze, bleibt es offen. Wie mache ich das in PHP?Wie behalte ich ein Python-Skript fortlaufend?

PHP-Datei -

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

In der Datei liveSensor.py Ich habe 2 Schwingungssensoren, die erkannt werden, und dann diese Informationen in sqlite vorbei, dann ruft meine PHP-Datei, dass Daten und Ajax I darstellen kann es. All dies funktioniert gut, außer dass die py-Datei ständig starten ..

py Skript -

#!/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() 

Das gibt mein ‚Welcome to Bases Loaded‘ Meldung im Browser, aber die py-Datei wird nicht geöffnet bleiben die erkennen Sensoren.

+0

Sie sollten (offensichtlich?) Bieten mehr Informationen darüber, was LiveSensor.py tatsächlich tun. – Aif

+0

Python-Daemon: http://StackOverflow.com/search?q=python+Daemon und warum würden Sie es mit PHP starten? –

+0

Ich starte es mit php als die Art und Weise, wie das Spiel eingerichtet wird, ist mit meinem Tablet als Anzeiger von den Krügen Hügel. Mit Apache2 kann ich also auf meinem lokalen Netzwerk streamen. Auch ich werde schließlich die Fähigkeit haben, von mehreren Spielen zu wählen, die ich in der Zukunft programmieren werde. Ich bin gerade bequemer, die Schnittstelle in PHP/html zu bauen –

Antwort

0

Für diese Art von Interaktion müssen Sie ein Server-Skript erstellen, das in einem separaten Prozess ausgeführt wird und ein Kommunikationsprotokoll verwendet, z. B. eine Datenbank. Wenn Sie darüber nachdenken, hat die PHP-Laufzeit keine Kontrolle über das Python-Skript: Sie kann es ausführen und Ihnen die Ausgabe bereitstellen, aber wie weiß die PHP-Laufzeit, wann und wie Sie Ergebnisse vom Skript benötigen?

Ein besserer Ansatz wäre es, einen REST-Dienst mit Python zu erstellen, der die Sensordaten bei Bedarf bereitstellt und Javascript verwendet, um AJAX-Anforderungen zu stellen und die Daten nach Bedarf abzurufen.

+0

Hey @ Cyb3rFly3r Ich benutze sqlite3, apache2, php5 und ajax für dieses, alles funktioniert groß, solange ich das anfange py-Skript von der Kommandozeile oder im Leerlauf. Kann nicht php bekommen, um die Py-Datei offen zu halten .. –