Script wird nicht Komplet ausgefürt

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Silvio1985
User
Beiträge: 3
Registriert: Montag 25. April 2016, 14:19

Hallo zusammen,
ich habe folgendes Problem:

Das Script funktionier auf dern Konsole des Raspberry ohne Probleme.
Ich möchte aber das Script per PHP Starten.
Starten kann man es aber es Läuft nur bis "print('test2')", das Heist das nix in die DB geschrieben wird.
Kann mir da jemand Helfen?



Code: Alles auswählen

#!/usr/bin/env python
#Python Timerklasse importieren
import time
#Python Raspberry Pi GPIO Klasse importieren
import RPi.GPIO as GPIO
import mysql



# Festlegung der Nutzung der vorgegebenen Nummerierung der GPIOs
GPIO.setmode(GPIO.BCM)

# Namen von True und False zum besseren Verstaendnis festlegen (Klarnamen)
HIGH = True  # 3,3V Pegel (high)
LOW  = False # 0V Pegel (low)



import mysql.connector;

try:
    connection = mysql.connector.connect(host = "localhost", user = "***", passwd = "***", db = "***")
except:
    print("Keine Verbindung zum Server")
    exit(0)



# SCI Funktion
def getAnalogData(adCh, CLKPin, DINPin, DOUTPin, CSPin):
    # Pegel definieren
    GPIO.output(CSPin,   HIGH)    
    GPIO.output(CSPin,   LOW)
    GPIO.output(CLKPin, LOW)
        
    cmd = adCh
    cmd |= 0b00011000 # Kommando zum Abruf der Analogwerte des Datenkanals adCh

    # Bitfolge senden
    for i in range(5):
        if (cmd & 0x10): # 4. Bit pruefen und mit 0 anfangen
            GPIO.output(DINPin, HIGH)
        else:
            GPIO.output(DINPin, LOW)
        # Clocksignal negative Flanke erzeugen   
        GPIO.output(CLKPin, HIGH)
        GPIO.output(CLKPin, LOW)
        cmd <<= 1 # Bitfolge eine Position nach links verschieben
            
    # Datenabruf
    adchvalue = 0 # Wert auf 0 zuruecksetzen
    for i in range(11):
        GPIO.output(CLKPin, HIGH)
        GPIO.output(CLKPin, LOW)
        adchvalue <<= 1 # 1 Postition nach links schieben
        if(GPIO.input(DOUTPin)):
            adchvalue |= 0x01
    #time.sleep(1)
    return adchvalue

# Konfiguration Eingangskanal und GPIOs Raspi-Belegung
#CH = 0  # Analog/Digital-Channel
CLK     = 11 # Clock  alles GPIO-Nummern GPIO1
DIN     = 10 # Digital in
DOUT    = 9 # Digital out
CS      = 8  # Chip-Select
print('test2')

# Pin-Programmierung
GPIO.setup(CLK, GPIO.OUT)
GPIO.setup(DIN, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

print('test3')

#try:
  #while True:
for z in range (8):
  #if (z==0 or z==1):# or z==2 or z==3 or z==4 or z==5 or z==6 or z==7 ):
        print ("Kanal " + str(z) + ": " + str(getAnalogData(z, CLK, DIN, DOUT, CS)))
        wert = str(getAnalogData(z, CLK, DIN, DOUT, CS))
        Kanal = str(z)
      
        send = "UPDATE `Rezept`.`wandler` SET `"+ Kanal +"` = '" + wert + "' WHERE `wandler`.`id` = 1;"
        cursor = connection.cursor()
        cursor.execute(send)
        cursor.close()
        connection.commit()
        
     #else:
      #  print ("Kanal " + str(z) + ": " + "- - - ")
      
#except KeyboardInterrupt:
GPIO.cleanup()
Gruß Silvio
DiHydrogenOxide
User
Beiträge: 5
Registriert: Dienstag 4. November 2014, 20:56
Kontaktdaten:

Es wäre interessant zu wissen, wie du das Script per PHP gestartet hast. GPIO.setup(..) in Zeile 70 bis 73 erfordert ja bekanntlich root-Rechte.
Ich könnte mir vorstellen, dass er abbricht, weil er die nicht hat.

Edit:
Und falls es das war, schau dir mal das hier an: https://wiki.ubuntuusers.de/sudo/Konfiguration/ Du musst die Passwortabfrage zum Ausführen deines Scriptes für den Benutzer www-data deaktivieren.
Silvio1985
User
Beiträge: 3
Registriert: Montag 25. April 2016, 14:19

[codebox=php file=Unbenannt.php]exec('python /var/www/html/digiwandler/read_mcp30082.py',$output,$error);[/code]

das wäre der code.

Habe auch schon versucht es mit :
[codebox=php file=Unbenannt.php]exec('sudo python /var/www/html/digiwandler/read_mcp30082.py',$output,$error);[/code]

versucht.

hoffe ihr könnt mir helfen.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn muss es letzteres sein - nur muss dazu natuerlich der user www-data (oder wie auch immer der Apache/PHP-User heisst) ein Sudoer sein, der das so ausfuehren darf.

Ggf. besser waere es, statt dem eh maessig guten RPI.GPIO den pigpio-Daemon zu verwenden. Damit hast du aus Python heraus gar keine Rechteprobleme mehr, weil das ueber's Netzwerk laeuft.

Inhaltlich sei noch angemerkt, dass dein zusammenstoppeln eines SQL-Strings problematisch ist. Benutze stattdessen besser Parameter. Also

Code: Alles auswählen

cursor.execute("UPDATE something SET foo = %s WHERE bar = %s", (10, 20))
Sieht klarer aus und du sparst dir auch noch das stringgekonvertiere. Und damit bist du auch fuer eine glorreiche Zukunft geruestet, in der du Parameter von PHP in das Skript reichst - denn sonst bist du scheunentorweit offen fuer SQL-Injection-Angriffe.
Antworten