Variable an Python übergeben

  • Hallo,


    ich bin neu hier und vesuche mich gerade in das Thema Raspberry einzuarbeiten. Gewisse Grundlagen haben ich mir in den letzten Tagen schon erarbeitet. Nun stoße ich auf folgende Herausforderung: Ich habe auf meinem Raspberry ein Python-Programm laufen. In diesem Programm existert eine Variable, nennen wir sie mal "Status". Diese Variable möchte ich nun per Button auf einer Website via PHP an Python von 0 auf 1 setzen. Ich habe schon viel im Internet gesucht, bin jedoch leider nicht fündig geworden. Viellicht gibt es hier jemanden der mir ein paar Code-Schnipsel "zuwerfen" kann.


    Wenn es dieses Thema hier schon gibt, möge man mir bitte verzeihen.
    Danke für eure Hilfe.

  • Das ist eine wichtige Information ;)
    Dann musst du andere Mechanismen wählen um dem Script Werte zu übergeben. Du kannst es dann ja nicht einfach noch mal ausführen da es bereits läuft.


    Dazu gäbe es wie immer mehrere Möglichkeiten:

    • Überwachung einer FIFO Datei.
    • Überwachung einer normale, temporäre, Datei.
    • Verbindung zum Script über ein Socket
    • HTML Übergaben ans Script mithilfe von Python Module wie Flask, Bottle, Django ...


    Bevor ich auf genauere Details eingehe wäre es wichtig zu wissen, Was das Script macht. Denn wenn du GPIO's schalten willst brauch ich mir keinen Wolf tippern, da gäbs ne sehr einfache Möglichkeit...

  • Danke schonmal für deine Antwort.


    Die Variable fungiert als Bedingung einer bedingten Anweisung (Schleife).
    In dieser Schleife werden verschiedene Dinge ausgeführt, aber keine GPIOs geschaltet.


    Den "Umweg" über die (Text)datei habe ich schon realisiert, jedoch dachte ich es gäbe etwas "schickeres".

  • Eine "schickere" Möglichkeit ist die erste: FIFO Datei. Denn dann werden keine unnötigen Schreibvorgänge auf dem Laufwerk vorgenommen.


    Auch die letzte genannten Möglichkeiten sind recht einfach, nur Socket kann etwas umständlicher sein, funktioniert aber auch super vorallem bidirektional.

  • Das mit den Schreibvorgängen hatte ich auch schon im Hinterkopf.


    Jetzt bin ich jedoch leider mit meinen Kentnissen am Ende.
    FIFO Datei? Das FIFO Prinzip ist mir bekannt, aber dies als Datei? Da kann ich mir spontan nichts drunter vorstellen.


    Ist es gf auch möglich dies über eine tempöräre "Datei" (virtuell) zu realisieren, um das Problem mit den Schreibvorgängen zu minimieren?


    Ein bidierektionaler Austausch wäre toll.

    Edited once, last by Kuenne ().

  • FIFOs sind genau das - das sind UNIX System-Primitive, welche bidirektionalen Austausch zwischen Programmen ermoeglichen. Das passiert ueber im Filesystem abgebildete "Dateien" - die sind aber nicht "echte", sondern dienen nur der Abstraktion. zB MySQL kann so lokal mit clients reden, ohne das man ueberhaupt ein Netzwerk braucht. Ein anderer Name dafuer sind "Named Pipes". Gibt's auch haufenweise Tutorials im Netz fuer.

  • Quote from meigrafd


    Bevor ich auf genauere Details eingehe wäre es wichtig zu wissen, Was das Script macht. Denn wenn du GPIO's schalten willst brauch ich mir keinen Wolf tippern, da gäbs ne sehr einfache Möglichkeit...


    Willst du diese sehr einfache Möglichkeit auch mit uns teilen?
    Bin ich sehr dran interessiert :)

  • Danke für eure Antworten.
    Ich werde mich mal zum Thema FIFO einlesen um zu schauen ob ich es hinbekomme.
    Ich werde berichten.

  • FIFOs sind zwar recht hübsch.


    Ich persönlich würde aber Sockets bevorzugen:
    Vorteil gegenüber FIFOs:
    - Mehr Flexibilität bzgl. verschiedener Rechner/Rechnerarchitekturen (wenn ein Prozess auf einem anderen Rechner läuft)
    - Bidirektional
    Nachteil gegenüber FIFOs:
    - Ein "wenig komplexer" (wobei Python eine schöne Lib hat)

  • Hallo,


    in den letzten Tagen habe ich mich wieder um dieses Thema gekümmert.
    Ich habe mich vorerst für die "Grundlagenforschung" für die Lösung mit der Textdatei entschieden.


    Was funktioniert?
    1.) Textdatei mit PHP beschreiben.
    2.) Textdatei mit Python auslesen und entsprechende Bedingungen erfüllen.


    Soweit so gut....


    Nun möchte ich jedoch ein Web-Interface basteln, auf dem sich viele Button, Checkboxen, ...etc. befinden. Jeder Button soll einen Wert in die Textdatei schreiben. Prinzipiell funktioniert das auch, jedoch stoße ich nun auf folgende Herausforderung:


    Auf meiner Hauptseite befinden sich die Button. Mit der Methode "POST" lassen sich nun Parameter übergeben in eine *.php Datei. Diese Datei öffnet sich, wird im Browser angezeigt und die Textdatei wird beschrieben. Jedoch möchte ich das Sichtbarwerden der *.php vermeiden. Das ganze soll im Hintergrund passieren , ohne das der Benutzer diesen Vorgang sieht.


    Ist dies mit PHP möglich oder ist hier eine andere Programmiersprache die bessere Wahl? Ich habe schon viel diesbezüglich gegoogelt, jedoch nicht das passende gefunden. Ich habe das Gefühl, PHP/HTML "legen mir zu viele Steine in den Weg".



    Danke für eure Antworten und Unterstützung.

    Edited once, last by Kuenne ().


  • Auf meiner Hauptseite befinden sich die Button. Mit der Methode "POST" lassen sich nun Parameter übergeben in eine *.php Datei. Diese Datei öffnet sich, wird im Browser angezeigt und die Textdatei wird beschrieben. Jedoch möchte ich das Sichtbarwerden der *.php vermeiden. Das ganze soll im Hintergrund passieren , ohne das der Benutzer diesen Vorgang sieht.


    Ist dies mit PHP möglich oder ist hier eine andere Programmiersprache die bessere Wahl? Ich habe schon viel diesbezüglich gegoogelt, jedoch nicht das passende gefunden. Ich habe das Gefühl, PHP/HTML "legen mir zu viele Steine in den Weg".


    Das kommt darauf an wie Du deine Button's programmiert hast - oder ist dein Code derart geheim das du ihn hier nicht posten kannst?
    Entweder den html Header durch Datei verändern oder schöner: Mit Javascript und dem onClick Event ginge sowas.

  • Hier der bisherige Code hierbei handelt es sich nur um ein kleines Testprogramm um die Funktion zu verstehen.


    Das Script "phpdatei.php" schaut dann in den Wert von $_Post und reagiert entsprechend.


    [code=php]<html>
    <head>
    </head>
    <Body>
    <form method="post" action="phpdatei.php">
    <input type="submit" name="Wert0" value="Wert_0">
    <input type="submit" name="Wert1" value="Wert_1">
    </form>
    </Body>
    </html>
    [/php]

  • Das musst du nicht in 2 Dateien aufsplitten - das ist auch eigentlich sehr untypisch. Lass "action" einfach auf das aktuelle PHP Script schicken und verarbeite es in der selben Datei


    Also zum Beispiel ist der Code den du zeigtest in der Datei index.php und dort machst du dann am Anfang das was in phpdatei.php steht (was auch immer da sein mag, zeigste ja leider nich...)
    [code=php]
    <?php
    if (isset($_POST["Wert0"])) {
    //tu was damit..
    } elseif (isset($_POST["Wert1"])) {
    //tu was damit..
    }
    ?>
    <html>
    <head>
    </head>
    <body>
    <form method="POST" action="">
    <input type="submit" name="Wert0" value="Wert_0">
    <input type="submit" name="Wert1" value="Wert_1">
    </form>
    </body>
    </html>
    [/php]


    Besser bzw sauberer wäre anstatt action="" zu nutzen, das hier: action="<?php $_SERVER['PHP_SELF']; ?>"
    Dann wird es ebenso wie "" an die aktuelle Datei übermittelt, ist aber wie gesagt sauberer


    Auch wenn du selbst nichts mit GPIO machen willst kannst du dir die Beschreibung in folgendem Thread mal durchlesen: FAQ --> Nützliche Links / Linksammlung --> Anleitung zum schalten von GPIO

  • Hallo,


    vielen Dank für deine Antwort.


    Leider funktioniert deine Lösung bei mir nicht.
    In der PHP-Datei wird eine Textdatei beschrieben, siehe Code.
    Wenn ich die Datei "auslager" funktioniert es. Innerhalb der HTML funktioniert es nicht. :no_sad:


    EDIT: auch ="<?php $_SERVER['PHP_SELF']; ?>" funktioniert nicht.


    Danke für eure Hilfe.





    [code=php]<?php
    $filename = "Test.txt";
    if(isset ($_POST["Wert0"])){
    $datei = file($filename);
    $datei = array_map("rtrim", $datei);
    $datei[4] = "123456";
    $content = implode(PHP_EOL, $datei);
    file_put_contents($filename, $content);
    } elseif (isset ($_POST["Wert1"])){
    datei = file($filename);
    $datei = array_map("rtrim", $datei);
    $datei[4] = "456789";
    $content = implode(PHP_EOL, $datei);
    file_put_contents($filename, $content);
    }
    ?>



    <html>
    <head>
    </head>
    <body>
    <form method="POST" action="">
    <!--
    <form method="POST" action="phpdatei.php">
    -->
    <input type="submit" name="Wert0" value="Wert_0">
    <input type="submit" name="Wert1" value="Wert_1">
    </form>
    </body>
    </html>[/php]

    Edited once, last by Kuenne ().

  • Oha sieht ja kompliziert aus - was soll das ganze bewirken? Kann das nicht so recht nachvollziehen...


    Folgendes funktioniert bei mir aber problemlos:
    [code=php]
    <?php
    if (isset($_POST) AND !empty($_POST)) {
    echo "<pre>";
    var_dump($_POST);
    echo "</pre>";


    $filename = "Test.txt";


    if (isset($_POST["Wert0"])) {
    $content = "123456";
    } elseif (isset($_POST["Wert1"])) {
    $content = "456789";
    }
    echo $content ."\n";
    $handle = @fopen($filename, 'w');
    @fwrite($handle, $content);
    @fclose($handle);
    }
    ?>


    <html>
    <head>
    </head>
    <body>
    <form method="POST" action="<?php $_SERVER['PHP_SELF']; ?>">
    <input type="submit" name="Wert0" value="Wert_0">
    <input type="submit" name="Wert1" value="Wert_1">
    </form>
    </body>
    </html>
    [/php]


    Die <pre> und var_dump Zeilen kannst du löschen wenn du willst - das zeigt dir nur das $_POST array an.
    Desweiteren sorgt der fopen mode "w" dafür das die Datei jedes mal auf 0 gekürzt wird - kannst du bei Bedarf ändern siehe http://php.net/manual/de/function.fopen.php
    Demo: http://RaspberryPi.roxxs.org/Kuenne/