Использование python для добавления данных в sqlite3, затем php5 для динамического извлечения данных на сервер apache2 с использованием python, php5, sqlite3

* ОБНОВЛЕНО
Я пытаюсь сделать игру для своего сына, в ней есть 2 датчика вибрации, которые представляют шары и удары (для бейсбола). Когда сенсор попал, у меня есть петля, которая добавляет галочку либо к удару, либо к мячу. Когда сенсор попал, я хочу, чтобы он также вошел в мою базу данных sqlite. затем у меня есть php-файл, который читает базу данных sqlite и отображает шары и удары, как они происходят в режиме реального времени. Я использую php5, sqlite3 и apache2 сервер. У меня есть настройка сервера, скрипт Python правильно определяет датчики и обновляет 2 переменные, шары и удары. Кажется, я не могу связать py-файл с php-файлом, поэтому, когда я перехожу к baseloaded.php, он выполняет sensor.py. Если я сначала запускаю скрипт py в режиме ожидания, затем перехожу на страницу php, которая корректно обновляется, просто не запускаю скрипт py из файла php.

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

KnockPin = 12
ShockPin = 13

BtnPin = 15

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)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def knock(ev=None):

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

global strikes
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:
conn.execute("UPDATE bl set STRIKE = 0 WHERE ID=1");
print ("Strike 3 Your Out :", conn.total_changes);

global inning
inning +=1
conn.execute("UPDATE bl set INNING = inning WHERE ID=1");
setstr()
print ("Inning Number :", inning);

def shock(ev=None):
with sqlite3.connect('basesLoaded.db') as conn;
print ("Opened database successfully");
global balls
balls += 1

if balls ==0:
pass
elif balls == 1:
conn.execute("UPDATE bl set BALL = 1 WHERE ID=1");
print ("Ball 1 :", conn.total_changes);

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

elif balls == 3:
conn.execute("UPDATE bl set BALL = 3 WHERE ID=1");
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");
print ("Run Scored! score is :", runs);
setstr()

def loop():

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__':     # Program start from here
setup()
try:
loop()

except KeyboardInterrupt:
destroy()

Вот мой PHP-скрипт для извлечения данных sqlite —

#basesLoaded.php file
<?php
$try = exec('python sensor.py');
print_r ($try);
$db = new SQLite3('basesLoaded.db');

echo '<br>';
echo '<br>';
$strikes = ($db->querySingle('SELECT STRIKE FROM bl WHERE ID = 1'));
$balls = ($db->querySingle('SELECT BALL FROM bl WHERE ID = 1'));
$outs = ($db->querySingle('SELECT OUT FROM bl WHERE ID = 1'));
$runs = ($db->querySingle('SELECT RUN FROM bl WHERE ID = 1'));
$inning = ($db->querySingle('SELECT INNING FROM bl WHERE ID = 1'));echo 'Strikes: ' . $strikes . '<br>';
echo 'Balls: ' . $balls . '<br>';
echo 'Outs: ' . $outs . '<br>';
echo 'Runs: ' . $runs . '<br>';
echo 'Inning: ' . $inning . '<br>';
?>

0

Решение

Как уже упоминалось в комментариях @Parfait, вы должны зафиксировать обновления, чтобы они были постоянными. Ваш PHP-код не видит обновления, потому что они не были зафиксированы.

Ты можешь позвонить conn.commit() однако в вашем коде простой способ гарантировать, что ваши обновления зафиксированы (или откатаны в случае ошибки), — это открыть базу данных с помощью контекстный менеджер, то есть используя with утверждение, например:

def knock(ev=None):
with sqlite3.connect('basesLoaded.db') as conn:
conn.execute("UPDATE bl set STRIKE = 1 WHERE ID =1")

Теперь ваши обновления будут автоматически зафиксированы, когда with оператор завершается, в этом случае, когда функция knock() возвращает или откатывается, если возникает исключение.


Обновить

Как обсуждалось в комментариях, кажется, что есть проблема с обработкой событий. Я подозреваю, что ваш код должен явно продолжать работать в противном случае, как только основной поток завершается, вся программа завершается. Вы можете сделать это так:

WAIT_PIN = 14

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)

def wait():
GPIO.wait_for_edge(WAIT_PIN, GPIO.BOTH)    # wait for level change

#    # Or wait in a while loop
#    while True:
#        time.sleep(0.1)

#    # Or wait for keyboard input
#    input('Press <ENTER> to quit: ')

if __name__ == '__main__':
try:
setup()
register_callbacks()
wait()    # block the main thread
except KeyboardInterrupt:
destroy()

Вам нужно, чтобы этот скрипт Python работал постоянно. Он не зависит от PHP-скрипта, который запускается только в ответ на HTTP-запросы через ваш веб-сервер. Вы можете запустить скрипт Python в качестве фонового процесса:

$ python sensor.py &

Кроме того, удалите exec() вызов из вашего сценария PHP.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]