php ruft python auf exec keine Rückgabe

  • Hallo
    Ich ruf mit einem php Script ein Python Script auf, das Python Script holt vom einemDHT12 über i2c Temp. und Feuchtigkeit.


    Rufe ich das Python Script in der Konsole auf bekomme ich folgende Ausgabe.

    Code
    1. Humidity = 19.8%
    2. Temperature : 25.5C
    3. checksum is correct


    Wenn ich das PHP Script im Browser aufrufe bekomme ich als Rückantwort ein leeres Array mit prinr_r angezeigt.
    $return_var zeigt eine 1 an
    Die Log von lighttpd zigt kein Fehler an.
    Was kann ich machen das es geht?
    Gruß NetFritz

    Edited once, last by NetFritz ().

  • Hallo
    Mit exce war nur ein versuch , mit shell_exec geht es auch nicht.
    $output = shell_exec('sudo /var/www/html/DHT12.py');
    print_r ($output);
    Rufe ich das PHP Script in der Konsole auf dann habe ich auch eine Ausgabe in der Konsole.


    Da ich das PHP eigentlich von jquery Ajax aufrufen will bin ich auch noch auf der suche wie ich das Python Script so um ändern kann
    das es von jquery Ajax aufgerufen werden kann und die Messwerte als Response in jquery ankommen.
    Gruß NetFritz

  • Na dann erlaube es ihm, wie soll das sonst gehen?
    Dein Webserver läuft als dieser User und ruft entsprechend auch als dieser deinen Befehl "sudo ...." auf. Er darf aber sudo nicht nutzen, also schlägt das Kommando fehl.


    "sudo visudo" und dann eine Zeile hinzufügen:

    Code
    1. www-data ALL=(ALL) NOPASSWD: /var/www/html/DHT12.py


    PS:

    Code
    1. sudo chown root:root /var/www/html/DHT12.py
    2. sudo chmod 755 /var/www/html/DHT12.py


    kann auch nicht schaden.

    Das S in IOT steht für Sicherheit.

    Edited once, last by llutz ().

  • Dinge tendieren zu funktionieren, kaum dass man sie richtig macht. ;)


    Denk dran: Durch das "chown root:root/chmod 755" hat nur noch root Schreibrechte an dem Python-Script. Du brauchst zukünftig also sudo um es zu ändern. Dafür kann aber ein amoklaufender Webserver (aka böser Mensch aus dem Internet) dir auch kein faules Ei ins Nest legen, in dem er dieses Script ändert.

    Das S in IOT steht für Sicherheit.

    Edited once, last by llutz ().

  • Wieso möchtest du PHP verwenden um ein Python Script auszuführen und dann auch noch dessen Rückgabe zu verwenden?
    Besser:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX



    Ansonsten wenn es unbedingt PHP sein muss:
    FAQ => Nützliche Links / Linksammlung => Befehle über PHP mit root Rechten ausführen (sudo webscript)

  • Hallo

    Quote

    Wieso möchtest du PHP verwenden um ein Python Script auszuführen und dann auch noch dessen Rückgabe zu verwenden?


    Wie schon gesagt, als Weboberfläche setze ich jQuery ein.
    Ich würde auch das Python Script direkt über Ajax aufrufen, habe aber noch keine Möglichkeit gefunden die Rückgabe von Python in jQuery
    auszuwerten.


    Das Python Script für den DHT12 (I2C) habe ich notgedrungen genommen weil ich sonst für den DHT12 nichts gefunden habe.


    Wenn möglich vermeide ich jeden Kontakt mit Python, nehme lieber Perl oder auch PHP-CLI und C++.
    Und ein Python Webserver kommt überhaupt nicht in Frage.


    Gruß NetFritz

    Edited once, last by NetFritz ().

  • Hallo

    Quote

    Wieso möchtest du PHP verwenden um ein Python Script auszuführen und dann auch noch dessen Rückgabe zu verwenden?


    Wie schon gesagt, als Weboberfläche setze ich jQuery ein.
    Ich würde auch das Python Script direkt über Ajax aufrufen, habe aber noch keine Möglichkeit gefunden die Rückgabe von Python in jQuery
    auszuwerten.


    Das Python Script für den DHT12 (I2C) habe ich notgedrungen genommen weil ich sonst für den DHT12 nichts gefunden habe.


    Wenn möglich vermeide ich jeden Kontakt mit Python, nehme lieber Perl oder auch PHP-CLI und C++.
    Und ein Python Webserver kommt überhaupt nicht in Frage.


    Gruß NetFritz

  • Ob du jQuery nutzt ist kein Argument gegen Python - denn jQuery ist nur JavaScript und das wiederum wird selbstverständlich auch von bottle&Co unterstützt.
    Du findest in besagter Anleitung mehrere Beispiele mit dazugehörigem Code. Eigentlich sind die Möglichkeiten dadurch sehr breit gestreut und die Umsetzung ziemlich einfach und effektiv.
    Aus meiner Sicht macht es halt wenig Sinn, wenn man Hardware via Python anspricht aber dann Umwege über weitere Sprachen geht - in diesem Fall PHP und einen Webserver wie apache2&Co.
    Man sollte immer so viel wie möglich mit einer Programmiersprache umsetzen nicht zig verschiedene mischen, denn jede weitere Sprache bremst aus und ist eine mögliche Fehlerquelle.


    Wenn dir C++ so sehr liegt kannst du das aber auch alles in C++ abwickeln, ebenfalls komplett ohne Python (auch die DHT22 Geschichte) oder PHP.



    Lese dir dazu doch mal das Manual zur Funktion exec durch: https://secure.php.net/manual/en/function.exec.php
    Die Funktion gibt dir nicht die komplette Ausgabe zurück.


    Das ist falsch.
    exec(); hinterlegt die komplette Ausgabe in Form eines Arrays in der ersten optionalen Variable (jede ausgegeben Zeile ist ein Element im Array) und hinterlegt zusätzlich den Exit-/Return-Code in die optionale zweite Variable.
    Steht aber auch in dem von dir angegebenen Link:

    Quote

    If the output argument is present, then the specified array will be filled with every line of output from the command.


    Du verwechselst das mit dem was unter "Return Values" steht, was aber was völlig anderes ist:
    [code=php]$return_value = exec("ls -la /", $output, $exitcode);[/php]
    In $return_value steht dann nur die letzte Zeile der Ausgabe, im Array $output aber die komplette also alle Zeilen.


    Im besagten "sudo webscript" Beitrag stehen weiter unten (in den Spoilern) auch verschiedene Möglichkeiten sowohl Ausgaben als auch return_var zu behandeln (error handling).