Python Skript über Webserver/Page starten

  • Hallo,

    ich möchte für ein Projekt gerne Pythonfunktionen über eine Website (Webserver) starten.

    Ich will eine Funktion starten, die einen GPIO Pin aktiviert, bzw. einschaltet und die Wegmessung einer Eisenbahn ermöglicht. Der Hallsesnor gibt Highsignale sobald eine Drehung vollendet ist, diese werden dann vom PI mit einem Pythonskript erfasst. Soweit bin ich schon. BZW. habe ich das alles über simple Hardware, also mit Schaltern usw. ermöglicht.

    Nun würde ich es gerne ermöglichen, dass ich über das Netzwerk/Website die Messung starten kann, also das Pythonskript aufrufen und wieder beenden kann. Da das RasPI nämlich auf dem Eisenbahn wagen mitfährt und ich Platz sparen möchte und natürlich eine bedinung über ein Smartphone zB. fortschrittlicher ist.:D Dieses soll wenn möglich auch einen Graph oder eine Ausgabe generieren, die mir die zurückgelegte Wegstrecke ausgibt. Für die Ausgabe gibt es ja verschiedene "Bibliotheken" wie ich bisher herausgefunden habe...

    Ich habe mir auch schon TUTs für WebIOpi angeschaut, allerdings scheint das für mich nicht das richtige zu sein, da es da ja quasi nur um HI/LO schalten von den IO geht...bzw. hab ich noch nicht rausgefunden, wie ich ein Pythonskript mit einem Buttonclick aufrufe...?! Da muss ich mich sehr wahrscheinlich mehr mit PHP auseinanderssetzen, oder? Und kennt sich jemand damit aus, Werte in eine Datenbank (SQL?) zu schreiben und diese dann auf der Webpage anzuzeigen?

    Habe bereits mySQL, Apache und php5 installiert, wie ich die einzelnen Komponenten nun zusammensetze ist mir allerdings nicht ganz klar...

  • Solche Fragen kommen hier leider öfter vor und ich hab hier auch irgendwo einen Post in denen ich mind 4 verschiedene Postings von mir zu diesem Thema aufgelistet habe, aber finde ihn grad nicht mehr wieder - da hatte ich im Prinzip 4x den selben kladaradatsch beschrieben... Das spar ich mir jetzt aber und gib dir nur den Link wo du solch eine Lösung nachlesen kannst - und ansonsten bitte die Forumsuche nach "sudowebscript" nutzen um noch mehr Beispiele zu finden:

    frogger
    17. Oktober 2013 um 14:12


    PS: ob bash oder python Script ist nebensächlich

  • So...ich bin nun ein paar Schritte weiter (eher bescheiden für gute 10h arbeit...aber es wird immer besser mit dem Linix Verständnis).

    Nun steh ich vor folgender Hürde:

    Ich habe ein python skript geschrieben, mit dem ich "debuge". Quasi einfach nur eine LED aufleuchten lassen...aber es klappt einfach nicht. :(
    (Das Python Skript an sich klappt natürlich, hab ich vorher getestet).

    1.
    - Ich habe die "sudoers" Datei um folgendes erweitert: "www-data ALL=NOPASSWD:/var/www/script.py"
    - zudem habe ich kontrolliert ob mein skript im /www ausführbar ist und rootrechte besitzt - beides der fall

    2.
    - ich habe den php und html code aus diesem Link kopiert und in meine index.html geschrieben
    - die seite lässt sich normal aufrufen
    - testweise habe ich den exec von "Red_On" auf :

    Code
    if (isset($_POST['RedON']))
    {
    exec('sudo python /var/www/skript.py');
    }

    geändert...Mir ging es einfach darum mal zu testen, ob das einfache Ausführen denn geht.

    Leider funktioniert es aber nicht und ich weiß nicht mehr weiter...:wallbash:
    Ich hab jetzt eben grade noch gelesen, dass es wohl auch ab und zu vorkommt, dass der php befehl "exec" nicht erlaubt ist. Ich kann leider den PHP Code auch kaum auf richtigkeit überprüfen, da ich kaum erfahrung habe.
    Letztendlich bräuchte ich nur 2 Buttons, die ein python skript starten.

  • Ich habe das, wie im Link gezeigt übernommen, weil der Fragensteller weiter unten im Threat meinte es funktioniert. Deswegen dachte ich, dass ich diesen Code "stumpf" übernehmen kann um zu testen.

    Aber hier nochmal der Code: (Es befindet sich alles im "index.html" file...liegt hier vll. der Hund begraben?)

  • In deinem Code fehlt das übermitteln des Formulars :)

    Das form ansich reicht dafür nicht, du brauchst auch noch ne "submit" Schaltfläche oder irgendwelche Buttons die das form übermitteln :)
    Siehe dazu zum Beispiel http://www.w3.org/TR/html401/interact/forms.html oder http://de.selfhtml.org/html/formulare/formularbuttons.htm

    Das einfachste wäre wenn du deinem <button> einfach den type="submit" hinzufügst aber eine Value solltest du auch angeben damit der 'name' nicht empty is :) Und dann wäre die Überprüfung auch einfacher...

    Aber eins nach dem anderen - also die erste Anpassung wäre:
    [code=php]
    <html>
    <head>
    <?php
    if (isset($_POST['RedON'])) {
    exec('sudo python /var/www/red_on.py');
    }
    if (isset($_POST['RedOFF'])) {
    exec('sudo python /var/www/red_off.py');
    }
    if (isset($_POST['YellowON'])) {
    exec('sudo python /var/www/gpio/yellow_on.py');
    }
    if (isset($_POST['YellowOFF'])) {
    exec('sudo python /var/www/gpio/yellow_off.py');
    }
    if (isset($_POST['GreenON'])) {
    exec('sudo python /var/www/gpio/green_on.py');
    }
    if (isset($_POST['GreenOFF'])) {
    exec('sudo python /var/www/gpio/green_off.py');
    }
    ?>

    <title></title>
    </head>
    <body>
    <form method="post">
    <table style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
    <tr>
    <th style="text-align: center;">Turn LED on</th>
    <th style="text-align: center;">Turn LED off</th>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="RedON">Red On</button></td>
    <td style="text-align: center;"><button type="submit" name="RedOFF">Red Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="YellowON">Yellow On</button></td>
    <td style="text-align: center;"><button type="submit" name="YellowOFF">Yellow Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="GreenON">Green On</button></td>
    <td style="text-align: center;"><button type="submit" name="GreenOFF">Green Off</button></td>
    </tr>
    </table>
    </form>
    </body>
    </html>
    [/php](hab aber auch den tbody raus genommen und th für die Überschrift der Tabelle gesetzt)

    Die zweite Änderung wäre dann folgende um die Prüfung zu vereinfachen:
    [code=php]
    <html>
    <head>
    <?php
    if (isset($_POST['LED']) AND !empty($_POST['LED'])) {
    if ($_POST['LED'] == "RedON") { exec('sudo python /var/www/red_on.py'); }
    if ($_POST['LED'] == "RedOFF") { exec('sudo python /var/www/red_off.py'); }
    if ($_POST['LED'] == "YellowON") { exec('sudo python /var/www/gpio/yellow_on.py'); }
    if ($_POST['LED'] == "YellowOFF") { exec('sudo python /var/www/gpio/yellow_off.py'); }
    if ($_POST['LED'] == "GreenON") { exec('sudo python /var/www/gpio/green_on.py'); }
    if ($_POST['LED'] == "GreenOFF") { exec('sudo python /var/www/gpio/green_off.py'); }
    }
    ?>

    <title></title>
    </head>
    <body>
    <form method="post">
    <table style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
    <tr>
    <th style="text-align: center;">Turn LED on</th>
    <th style="text-align: center;">Turn LED off</th>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedON">Red On</button></td>
    <td style="text-align: center;"><button type="submit" name="LED" value="RedOFF">Red Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="LED" value="YellowON">Yellow On</button></td>
    <td style="text-align: center;"><button type="submit" name="LED" value="YellowOFF">Yellow Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="LED" value="GreenON">Green On</button></td>
    <td style="text-align: center;"><button type="submit" name="LED" value="GreenOFF">Green Off</button></td>
    </tr>
    </table>
    </form>
    </body>
    </html>
    [/php]
    Die erste if Schleife prüft erstmal ob $_POST['LED'] überhaupt gesetzt und nicht leer ist..
    Für das danach wäre es einfacher wenn es nur ein python Script gäbe an das dann einfach übergeben wird welche LED wie geschaltet werden soll, aber das hab ich jetzt mal weggelassen :D

    Du kannst dir auch anzeigen lassen was $_POST beinhaltet:
    [code=php]var_dump($_POST);[/php]


    /EDIT: Deine Datei muss auf *.php enden also: index.php

  • Erstmal vielen dank für deine ausführliche Hilfe und Mühe!:thumbs1:

    Leider klappt der Code bei mir nicht. Im Error-Log steht folgendes:
    "PHP Parse error: syntax error, unexpected '\xc2\xa0AND\xc2\xa0' (T_STRING) in /var/www/index.php on line"

    Weiß jemand rat?

  • Hat jetzt alles geklappt! Hab viel rumprobiert, aber es läuft nun endlich...

    Eine Finale Frage habe ich noch: Das Pythonskript was ich aufrufe, ist eine Dauerschleife. Nun stellt sich mir die Frage, wie ich das über einen Brwoserbutton wieder beende?!
    Könnte ich mit einem Klick auf einen anderen Browserbutton folgendes Skript über PHP aufrufen:

    beenden.py
    gpio.cleanup()
    sys.Exit()

    Oder mach ich es mir da grade zu eibnfach?

  • Du kannst das imho nur beenden in dem du die Prozess killst - ich glaub nicht das der selbe Prozess noch ein Parameter aufnehmen kann, dann würde das Script aber vermutlich einfach nochmal ausgeführt werden was dir dann aber nichts bringt..

    Also einen Button machen der nur angezeigt wird wenn das python Script läuft und dieser das python Script dann bei betätigen killt...

    Da du aber nicht nur ein Script sondern 3 verschiedene hast, ist der Programmieraufwand hierfür unverhältnissmässig viel ... Mein Tipp hierfür ist, wie oben bereits erwähnt, ein einziges python Script welches 2 Parameter erwartet: LEDfarbe und State

    Das hätte nämlich auch den Vorteil das du nur ein Script überprüfen müsstest ob dieses läuft - also nochmals weniger Programmieraufwand - und es wird auch wesendlich übersichtlicher


    Spoiler anzeigen

    [code=php]
    <html>
    <head>
    <title></title>
    </head>
    <body>

    <?php
    if (isset($_POST['STOP'])) {
    exec('sudo killall -9 led.py',$output,$return_var);
    }
    if (isset($_POST['RedON'])) {
    exec('sudo python /var/www/led.py red on');
    }
    if (isset($_POST['RedOFF'])) {
    exec('sudo python /var/www/led.py red off');
    }
    if (isset($_POST['YellowON'])) {
    exec('sudo python /var/www/gpio/led.py yellow on');
    }
    if (isset($_POST['YellowOFF'])) {
    exec('sudo python /var/www/gpio/led.py yellow off');
    }
    if (isset($_POST['GreenON'])) {
    exec('sudo python /var/www/gpio/led.py green on');
    }
    if (isset($_POST['GreenOFF'])) {
    exec('sudo python /var/www/gpio/led.py green off');
    }
    ?>

    <form method="post">
    <table style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
    <tr>
    <th style="text-align: center;">Turn LED on</th>
    <th style="text-align: center;">Turn LED off</th>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="RedON">Red On</button></td>
    <td style="text-align: center;"><button type="submit" name="RedOFF">Red Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="YellowON">Yellow On</button></td>
    <td style="text-align: center;"><button type="submit" name="YellowOFF">Yellow Off</button></td>
    </tr>
    <tr>
    <td style="text-align: center;"><button type="submit" name="GreenON">Green On</button></td>
    <td style="text-align: center;"><button type="submit" name="GreenOFF">Green Off</button></td>
    </tr>
    </table>
    <?php
    if ( exec("ps aux | grep -v grep | grep led.py") ) { echo "<button type='submit' name='STOP'>Stop led.py</button>\n"; }
    ?>
    </form>

    </body>
    </html>
    [/php]

    Man könnte das sogar noch einfacher und variabler Programmieren (also nicht mehr hardcoded welche Farbe welchen State haben soll)

  • Hallo,

    ich muss mich jetzt mal hier mit anschrießen da mein script per php nicht läuft. Ich habe schon alles versucht und auch alles in diesem und vielen weiteren threads gelesen leider ohne jeglichen erfolg.

    eigentlich total simple ich habe ein kleine php dabei und ein Python script was es ausführen soll nach einem druck des submits was es aber nicht tut.

    Ich habe bereits die sudoers mit www-data ergänzt und auch das script hat 777 rechte. Die php dabei ist nur im lokalen Netzwerk und nicht von außen erreichbar.

    das script ist mit "python /var/www/pic.py" funktionsfähig.

    im log steht absolut nix drin.

    hier mal der code:

    [font="Menlo"]<!DOCTYPE html>[/font]

    [font="Menlo"]<html>[/font]
    [font="Menlo"] <head>[/font]
    [font="Menlo"] <meta charset="UTF-8">[/font]
    [font="Menlo"] <link rel="stylesheet" href="style.css" />[/font]
    [font="Menlo"]<?php[/font]
    [font="Menlo"] if(isset($_POST['pic'])) {[/font]
    [font="Menlo"] exec('python /var/www/pic.py');[/font]
    [font="Menlo"] }[/font]
    [font="Menlo"]?>[/font]
    [font="Menlo"] </head>[/font]
    [font="Menlo"] <body>[/font]
    [font="Menlo"] <form action="index.php" method="POST">[/font]
    [font="Menlo"] <input id="pic" name="pic" type="submit" value="FOTO" />[/font]
    [font="Menlo"] </form>[/font]
    [font="Menlo"] <hr>[/font]
    [font="Menlo"] <form id="unten" action="bildergalerie.php" method="POST">[/font]
    [font="Menlo"] <input id="galerie" name="galerie" type="submit" value="GALERIE" />[/font]
    [font="Menlo"] </form>[/font]
    [font="Menlo"] </body>[/font]
    [font="Menlo"]</html>[/font]

    [font="Menlo"]danke euch [/font][font="Menlo"]Mit freundlichen Grüßen [/font]

    Einmal editiert, zuletzt von fischi87 (3. Juli 2016 um 17:46)

  • 1. Bitte verwende CODE Blöcke
    2. 777 ist übertrieben.
    3. Was steht im pic.py Script?


    PS: FAQ => Nützliche Links / Linksammlung => Befehle über PHP mit root Rechten ausführen (sudo webscript)
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX
    FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO => Einführung (auch wenn du keine GPIOs schalten willst!)

  • sorry hab ich vercheckt

  • Der Shebang ist fehlerhaft, wenn du die Datei direkt dem Interpreter übergibst aber auch überflüssig.

    Aber wie gesagt, lies dir bitte den von mir verlinkten Thread durch - insbesondere den Teil bezüglich GPIO schalten auch wenn du keine GPIOs schalten willst, und davon dann die Einführung. Spätestens deine vorletzte Zeile wird Probleme machen da das Script nicht als "pi" sondern "www-data" ausgeführt wird.

    Alternativ leitest du Ausgaben und Fehler in eine Datei um: https://wiki.ubuntuusers.de/Shell/Umleitungen/

  • Darum gings nicht. Du willst keine GPIOs schalten, du willst auf das Verzeichnis einen anderen Benutzers zugreifen -> Fail. Also noch mal: Einführung bezüglich "www-data" Benutzer lesen, das sind die ersten 3 Zeilen der Einführung. Bedeutet für dich: Speicher die Bilddatei in einem Verzeichnis wo www-data auch Zugriffsrechte drauf hat

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!