Pythonskript mit Eingabeaufforderung über PHP starten

  • Hallo,

    zu PHP und Python gibt es hier ja auch schon etliche Beiträge, allerdings konnte ich davon leider bisher nichts erfolgreich selbst reproduzieren bzw. habe eine auf mein Problem passende Diskussion auch noch nicht entdeckt. Falls es dazu bereits eine Lösung/Antworten gibt wäre ich auch schon für die entsprechenden Verweise dankbar :)

    ich habe ein bereits fertiges Python-Skript, welches auch problemlos über die Konsole läuft. Nun würde ich dieses Skript allerdings gerne über einen Button auf einer Website bzw. einem Webinterface starten.

    Jedoch wirds erst jetzt etwas knifflig vermute ich, denn: nach dem Start über die Konsole wartet das Skript auf die Eingabe eines Wertes in selbiger. Diese Eingabe würde ich jetzt gerne über das angesprochene Interface realisieren. Umgangssprachlich also eine Eingabe von einem Webinterface direkt an die Konsole senden.

    Ist soetwas machbar?

    Vielen Dank schon mal an die weisen Köpfe hier und bitte verzeiht, wenn ich bei noch folgendem Code grundlegende Fehler gemacht haben sollte, ich bin noch recht neu in der Materie...

    Den Code für das Interface gibt es noch nicht, hier hab ich mich erstmal an einer einfachen Seite mit einem Button zum starten des Skripts versucht:

    Wahrscheinlich fehlt die entsprechende form/method bzw. ein submit-Button, wenn ich bisher alles richtig verstanden hab..

    bzw. sollte wahrscheinlich auch eher $_POST statt $GET benutzt werden?

    Der Python code ist mit shebang versehen

    Code
    [Python]
    #!/usr/bin/env python3
    
    (...)

    Und die enstrpechenden rechte habe ich (glaube ich) an www-data übertragen:

    Code
    www-data ALL=(root) NOPASSWD: /var/www/html/test.py

    Einmal editiert, zuletzt von Kuchen (5. Oktober 2017 um 20:26)

  • Pythonskript mit Eingabeaufforderung über PHP starten? Schau mal ob du hier fündig wirst!

  • Ich hab den Beitrag wahrscheinlich auch etwas missverständlich verfasst, das Interface ist hier noch gar nicht vorhanden, ich wäre erstmal froh, wenn das Python Skript schonmal anspringen würde.

    Aber danke schon mal für den Verweis, werde mich damit mal auseinandersetzen.

  • <button name="sid">starten </button><br> variable anpassen


    <td><a href="<?php print($_SERVER['PHP_SELF']); ?>?sid=start">schtarten</a></td> variablen anpassen

    mit folgenden befehlen konnte ich in mein webinterface prozesse starten via php

    ich starte jedoch über shell script mein python programm da ich ebenfalls probleme hatte das python starten wollte

    aber mit den start von ein shell script hats wunderbar geklappt

    grüße

  • diskus-tempel: Hier in diesem Thread geht es um was anderes... Generell hast aber auch Du ein fehlerhaftes Konzept, was ich dir in deinem Thread aber auch schon schrieb.

    Kuchen: Auch dein Konzept erscheint mir fehlerhaft :fies:

    Bitte lest euch beide die Anleitung durch die Linus nannte... Aktuell sieht sie seit unserem Forum-Umzug etwas kaputt aus, inhaltlich sollte sie aber verstanden werden..... Keine Lust mich ständig zu wiederholen, deshalb gibts solche Threads wo's ausführlich beschrieben steht.

    Wenn du mit dem Python Script eine Interaktion benötigst dann hast du die Möglichkeit über eine sog. Inter-Prozess-Kommunikation zu verwenden. Das wäre wohl der beste Weg - ist aber davon abhängig was dein Python Script überhaupt macht und wieso es zwingend erforderlich ist die Eingabe erst nach starten des Python Scripts zu erledigen? Man kann dem Script beim ausführen nämlich auch Parameter übergeben

    Bitte erklär noch mal detaillierter was genau du vor hast und was in deinem Python Script drin steht.

  • Hallo meigrafd,

    Ich bin jetzt immerhin schonmal soweit, dass ich das python-Skript über PHP starten konnte.

    Mein Konzept habe ich auch auch etwas überarbeitet. Das Python-Skript soll jetzt direkt mit den eingegebenen Werten gestartet werden. Das macht es nicht mehr zwinged erforderlich das Skript zuerst zu starten :)

    Könntest du mir evtl. die angesprochene Inter-Prozess-Kommunikation kurz erläutern oder einen entsprechenden Verweis dazu bereitstellen?

    Das Python-Skript steuert einen mit dem RPi verbundenen Sensor (Temperatur) und ich möchte quasi einstellen können wieviele Messungen durchgeführt werden. (bzw. kann ich das ja bereits einstellen, allerdings würde ich das jetzt gerne über ein entsprechendes Webinterface steuern können).

    Die von linusg gepostete Anleitung habe ich mir auch zu Herzen genommen, allerdings übersteigt das derzeit noch deutlich meine Fähigkeiten/Verständnis der Materie..da muss ich mich erstmal langsam rantasten.

    Bzgl. des Interfaces hatte ich mir jetzt folgendes überlegt, vlt kannst du ja kurz eine Einschätzung abgeben, ob das so umsetzbar ist.

    Als Eingabe-interface

    und die entsprechende start.php

    Wahrscheinlich muss ich den $_POST[ ] erst zuvor zwischenspreichern und kann es nicht direkt in den shell_exec() Befehl schreiben, oder?

    Das ist jetzt erstmal grob, getestet wird das morgen....

    und vielen Dank schonmal für die Hilfe


    Einmal editiert, zuletzt von Kuchen (7. Oktober 2017 um 23:44)

  • Also zunächst brauchst du keine extra *.html Datei, du hast in der start.php ja auch HTML Code drin stehen, da kann auch der Rest rein.

    Da dein <form> aber als Methode POST verwendet musst du auch $_POST verarbeiten, nicht $_GET

    Problem ist:

    Solange das PHP Script beschäftigt ist wird der Browser blockiert. Desweiteren gibt es eine Zeitbegrenzung wie lange ein PHP Script über den Webserver ausgeführt werden kann/darf.

    Das nächste ist dass du ja auch die Werte vom Python Script wieder ins Webinterface zurück haben willst oder nicht?


    Es ist (zumindest für mich) immer etwas schwierig das Vorhaben jemand fremdes im ganzen Umfang zu verstehen wenn es aber keine Beschreibung desjenigen gibt... Es gibt etliche Möglichkeiten, nicht blos eine. Nur welche ist für Dich die passende?

    ...Du bist auch nicht der erste und gewiss nicht der letzte der irgendein Script übers Web ansprechen/starten will... Nur bitte verstehe das wir uns nicht pausenlos wiederholen wollen, deshalb gibts so Anleitungen wie oben genannt.


    Du hast aus meiner Sicht zwei Möglichkeiten:

    1. apache2 deinstallieren (sofern du den nicht für was anderes nutzt) und stattdessen web_bottle.py verwenden. Das ist wirklich nicht schwer. Für dein Vorhaben reicht die 3.Variante von oben genannter Anleitung => http://codepad.org/52oDG5ES

    Das wäre inbesondere im Bezug auf Python Scripts die beste Möglichkeit.

    ...zugegeben, seit dem Umzug des Forums auf eine neue Software sind die Beiträge leider kaputt, aber wenn du es nicht mal versuchst kann dir auch nicht geholfen werden. Nur wer den Mund auf macht kann gehört werden.

    2. Du führst das Python Script im Hintergrund aus und wertest Ausgaben separat aus.

  • Hallo meigrafd,

    ich hab die vergangenen tage mal genutzt, um mich etwas weitergehend mit dem Thema zu beschäftigen.

    Zunächst nal zu deiner Vermutung:

    Ja die Werte hätte ich schon auch gerne wieder zurück, bzw sollen sie letztlich auch als Graph angezeigt werden, allerdings muss ich ja erstmal eins nach dem anderen machen. Aber es ist natürlich sinnvoller erstmal das ganze Vorhaben zu erläutern, da man sonst ja auf vielleicht ganz andere grundlegende Ansätze verweist. Am Ende soll es mal so sein, dass ich über das Interface die Eingabe tätige, das Python-Skript macht dann seine Arbeit und ich sehe dann im Idealfall direkt im Interface, sonst auf einer zweiten Seite, einen Graph der mit den Temperaturverlauf anzeigt.

    Ich erwarte auch keine Schritt für Schritt Anleitung, da ich allerdings noch recht neu in der Thematik bin sind Tipps, Kniffe und Denkanstöße von Leuten mit mehr Erfahrung natürlich gerne gesehen.

    Zum Webinterface:

    soweit ich jetzt mal rausgefunden habe, ist bottle.py vom Prinzip her (!) vergleichbar mit Django o.ä. und für kleine Anwednungen gedacht, wobei ich da ja dann auch html Code einbinden kann? Insgesamt ist mir da noch etwas schleierhaft wie ich das gaze dann gestalte, aber das würde sich wahrscheinlich über learning by doing herausfinden lassen. Mit jedem lesen mehr kommt auch Stück für Stück das Vertsändnis. :D

    Wie du als 2. Variante vorgeschlagen hast könnte ich das python-Skript auch wie angefangen über apache und html bzw. php Skripte starten und Werte übergeben mittels bspw.

    Code
    $Anzahl = $POST["anzahl"]

    und im exec-Befehl dann enstprechend aufrufen mit

    Code
    shell_exec("sudo  /var/www/html/test.py '.$Anzahl.';  ")

    Allerdings habe ich dann die Problematik des blockierten Browers bzw. dass ich das Skript irgendwie in den Hintergrund schieben muss, richtig?

    Als weitere Variante habe ich jetzt noch gefunden, dass es offenbar ein "Python-Modul" gibt, dass mir dann dasselbe erlaubt wie bspw bottle, also python code direkt ins interface einzubinden ohne den umweg über php-Dateien, wobei das ja dann wahrscheinlich auch etwas redundant ist bzw. die Variante über bottle deutlich effizienter?

    Habe ich bis hierher erstmal alles korrekt verstanden oder haben sich noch grobe Fehler aufgetan?

    Und dann stellt sich mir die Frage, was sich für meine Zwecke am ehesten anbietet, also reicht ein kleines Framework auch für die Visualisierung und eine "graphisch annehmbare Gestaltung des Interfaces" oder bietet sich das lediglich an wenn man nur die Eingabe tätigen möchte?

    Ist evtl. der Wechsel auf einen kleineren Server bspw. nginx, lighttpd sinnvoller?

    Vielleicht hast du ja Zeit und Gelegenheit hier nochmal drüber zu schauen, danke schonmal für die Mühe.

    VG

    Kuchen

  • Als weitere Variante habe ich jetzt noch gefunden, dass es offenbar ein "Python-Modul" gibt, dass mir dann dasselbe erlaubt wie bspw bottle, also python code direkt ins interface einzubinden ohne den umweg über php-Dateien, wobei das ja dann wahrscheinlich auch etwas redundant ist bzw. die Variante über bottle deutlich effizienter?

    Welches wäre das?

    Habe ich bis hierher erstmal alles korrekt verstanden oder haben sich noch grobe Fehler aufgetan?

    Ein grober Fehler wäre: Das Script genau so zu benennen wie das Module. bottle.py wäre also ein falscher Dateiname.

    Und dann stellt sich mir die Frage, was sich für meine Zwecke am ehesten anbietet, also reicht ein kleines Framework auch für die Visualisierung und eine "graphisch annehmbare Gestaltung des Interfaces" oder bietet sich das lediglich an wenn man nur die Eingabe tätigen möchte?

    Ist evtl. der Wechsel auf einen kleineren Server bspw. nginx, lighttpd sinnvoller?

    Wie gesagt, ich würde komplett weg von PHP gehen und selbstverständlich kann über bottle auch eine Visualisierung laufen wie zB hier zu sehen: https://github.com/meigrafd/HighCharts__python

  • Ich gebe euch beiden recht, wenn man es nicht weiß, ist es ein grausames Feature. Trotzdem ist das Importsystem von Python ziemlich gut und zu einigem fähig. Trotzdem denke ich, hatte man da die Exceptionmessage anpassen können, wenn ein Import aus einem Modul fehlschlägt, das genau so heißt wie die importierende Datei, den dann ist man ja in nahezu 100% der Fälle in das Fettnäpfchen getreten.

  • Hallo nochmal meigrafd,

    ich habe die entsprechende Seite zu dem Modul leider nicht gespeichert und finde es jetzt auf die Schnelle leider auch nicht mehr. Wenn ich nochmal darauf stoße, werde ich es hier verlinken.

    Die Problematik der richtigen Benennung des Skriptes habe ich beachtet. Allerdings komme ich nicht wirklich über den ersten Schritt hinaus. Ich kann mir die zufälligen Zahlen anzeigen lassen, weiß dann aber nicht mehr wirklich weiter. Zwar bekomme ich mein Skript auch als route gestartet mit der entsprechenden variable als Eingabe in die URL-Zeile

    Quasi so:

    Code
    @route('test/<anzahl>')


    aber das ist ja nicht Sinn der Sache.

    Du hast zwar in deinem Beispiel auch Buttons realisiert, allerdings ohne Eingabefeld. Wie bekomme ich sowas denn hin? Läuft das auch über die SEND-function oder geht das bspw auch als submit-Variante? Ich stehe da gerade ziemlich auf dem Schlauch.

    Weiterhin war für mich noch nicht ganz ersichtlich, ob auch die control.js und die entsprechenden routes /cmd und /data immer dazu gehören oder optional sind?

    Also wie komme ich von hier:

    HTML
    <!DOCTYPE HTML>
    <html>  
    <body>
    <form action="start.php" method="post">
    Anzahl: <input type="text" name="anzahl"><br>
    <input type="submit">
    </form>
    </body>
    </html>

    zu dem Äquvalent mit bottle? bzw wie muss ich das umgestalten, wenn mein Pythonskript zum messen auf den Parameter "Anzahl" wartet? Wie bekomme ich meine Eingabe an mein Skript übergeben..ohne route ??(

    Vielen dank nochmals für die Mühe und v.a. Geduld..

    VG Kuchen

  • bottle ersetzt den Webserver, Python ersetzt PHP. Alles andere bleibt, also HTML und JavaScript nutzt man (nahezu) ebenso wie zuvor.

    In meiner Anleitung wird über control.js diverses JavaScript Zeugs bereitgestellt: Funktionen, Debughilfen, AJAX. Also grob betrachtet sind die Optional, ja, wenn du sowas halt nicht nutzen willst - aber Teil 3 der Anleitung sieht ja vor: Ein Webserver in Python, mit unterschiedlichen "route"s für reines Polling, ohne WebSocket.

    Nur wie willst du Polling, ohne AJAX und Websocket nutzen? Gar nicht.

    Verstehst du nun besser was es mit den Dateien auf sich hat?

    Wenn du den Teil 3 der Anleitung unverändert übernimmst dann funktioniert das 100%. Falls nicht hast du was falsch gemacht und solltest das erst beheben bevor du weitere Änderungen vornimmst, das macht sonst wenig Sinn wenn man level1 schon nicht schafft.

    Wenn du dann Änderungen vornimmst und irgend etwas funktioniert nicht, dann beschreib bitte genau was du gemacht hast (code posten) sowie wie sich das "funktioniert nicht" bemerkbar macht - ansonsten können wir auch nur mit den Schultern zucken...

    Der Webserver stellt gewisse Inhalte bereit, aber ein Client kann darauf nur über einen Web-Browser zugreifen. Wenn du also eine "Eingabe" an einen Webserver senden willst, brauchst du? Eine POST oder GET Übergabe. In meinem 'Teil 3' der Anleitung wird GET verwendet, nämlich der explizite Aufruf einer URL (route), worauf der Webserver dann reagiert - anstatt PHP verarbeitet das halt Python. Deine letzte Frage wird hier behandelt: http://bottlepy.org/docs/dev/tutor…l-form-handling


    Um das noch mal fest zu halten:

    Du hast ein Web-Interface auf dem du über eine Eingabemaske angeben möchtest wie viele Messungen durchgeführt werden sollen.

    Wenn dann die von dir definierte Anzahl an Messungen durchgeführt werden möchtest du quasi direkt auch die Ergebnisse sehen.

    Soweit richtig?

    (es ist schwierig den Faden zu behalten wenn die Beiträge in Abständen von mehreren Tagen eintrudeln, und sehr mühsam sich jedes mal erneut einzulesen worum es eigentlich ging)

Jetzt mitmachen!

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