Python Werte an Bash übergeben

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich bin noch ziemlich neu in der Programmierung und habe folgendes Problem.

    Ich möchte einen Python Wert ( Zahl) welcher von den 1 Wire Sesnopren oder Fechtesensoren kommt ins Bash übergeben.

    Ich habe eine PHP Server aufgesetzt und in dem möchte ich mit "echo $ WERTE" die Werte anzeigen ohne auf die SD zu schreiben.

    Die PHP seite ruft dann immer den Werte aus der Bash auf.
    Das funktioniert alles soweit....

    Was ich jetzt brauche ist eben einen Befehlssatz wie ich den Python Wert $WERT von Python ins Bash bekomme, sodas ich ihn in der shell nutzen kann.

    Für eure Hilfe bin ich Dankbar... Gruss Kollemann

  • Hm also was denn jetzt, bash oder php :huh:


    Naja egal.. Kommt eh aufs selbe raus:

    Sog. Parameter oder Argumente werden anhand eines Leerzeichens dazwischen erkannt. So würde zum Beispiel ls der Befehl oder das Script sein und -la der 1. Parameter und /tmp das 2.

    Übergibst du dann an ein bash Script mehrere Parameter/Argumente wird in $1 das erste, in $2 das zweite, in $3 das dritte usw hinterlegt.
    Würde man also zB bla.sh hallo welt ausführen könnte man im blah.sh Script mit echo $1 die erste Übergabe hallo ausgeben lassen und mit echo $2 würde man welt ausgeben...

    Bei PHP verhält sich das ähnlich, allerdings kommt es da darauf an wie man das Script anspricht:
    Wird über HTTP ein Argument an die Datei übergeben wird das ins globale Array $_GET abgelegt
    Wird über die Konsole bzw CLI (cli = command line) ein Argument übergeben wird das in $argv abgelegt. $argv[1] würde also den 1.Parameter enthalten usw

    Also bitte noch mal beschreiben was genau du vor hast - das da oben ist kaudawelsch

  • Hallo,
    sorry , ich versuche es besser zu beschreiben.
    Also ich habe auf meinem Raspberry Python drauf und den apache2 mit PHP support.

    Dass Python script liest Werte von Temp und Feuchte aus.
    Diese Werte kann ich unter Python mit print xxx anzeigen.

    Ich möchte aber die Werte auf der Index.php des apache2 anzeigen lassen.

    wie bekomme ich die Werte aus dem Python script auf die Index.php ?#
    Ich dachte über Umweg... Python ins Bash und dann ins PHP?
    Aber wenns was gibt , wie ich den Werte direkt in die Index PHP bekomme?
    Umso besser...

    Das ist zum Beispiel ein print Wert aus Python welcher auf die Index.php Seite sollte:

    print (str(w1_slave) + ´: %6.2f °C´% temperatur)

    --> temperatur

    Ich hoffe jetzt ist es verständlicher.....:danke_ATDE:

    Beste Grüsse
    Kollemann

  • Wie immer gäbe es mehrere Möglichkeiten:

    • Das Python Script in der index.php aufrufen und die Ausgabe entsprechend verarbeiten
    • Ein zusätzliches bash Script im index.php aufrufen, was aber das selbe wie 1. wäre
    • Die Scripts weg lassen und die /sys/bus/... Datei direkt öffnen/auslesen

    Zu 1.&2.:
    Das könnte man zB wie folgt bewerkstelligen:[code=php]exec("/path/to/pythonscript.py", $output, $return_var);
    if (!empty($output)) {
    $temp = $output[0];
    }[/php]

    Zu 3.:
    Ich kenn nicht den genauen Path zu deiner Datei, das müsstest du dann eben noch anpassen:
    [code=php]$lines = file("/sys/bus/w1/devices/XYZABC/w1_slave");
    foreach ($lines AS $line) {
    if (preg_match("/t=(.*)/", $line, $match)) {
    $temp = $match[1];
    }
    }[/php]

  • Hallo,
    erstmal Danke für die Hilfe.
    Eine datei schreiben möchte ich nicht, von wegen dauer - schreiben auf SD.
    Aber Danke für die Hilfe.

    Nochmal zu den Tips ....
    Sorry ich steh echt grad auf dem Schlauch.
    Vielleicht weil ich auch noch nicht so der Held im prog bin.


    Lösung 1 & 2 würde mir gefallen, aber ich verstehe es nicht ganz.
    Der Wert, bzw. die Variable wo der Wert drinnen steht heist im Python
    " temperature"

    Wo muss die Variable im ersten Beispiel stehen, oder ist " $output " der Platzhalter dafür ?
    Oder ist "$temp" der Platzhalter für mein "temperature" ?

    Hab beides probiert, irgendwie gehts nicht.

    Den Wert "temperature" müsste ich ja erstmal mit einfachem

    echo " Wert $temperature";

    in Index PHP anzeigen können, oder ?

    Beste Grüsse

  • Das PHP-Script (index.php) führt das Python-Script aus und hinterlegt jede Zeile ins Array $output. Hast du im Python Script also 2 Zeilen die durch ein print ausgegeben werden, stünde die erste Ausgabe in $output[0] und die zweite Ausgabe in $output[1] usw.

    Ansonsten bitte deine index.php in CODE posten, dann kann man da besser drauf eingehen.

  • Oh Schande, so lange probiert und klappt immer noch nicht...
    :wallbash:

    Also nochmal gaanz langsam:

    Wenn ich im Terminal eintipp, kommen die 5 Werte....

    root@raspberrypi:/home/pi# sudo python 1wire_read2.py
    28-000005745242: 21.00 C
    28-000005682022: 21.19 C
    28-00000568e8aa: 21.00 C
    28-00000568b42e: 20.94 C
    28-0000056866ee: 21.00 C

    Das Python Script sieht wie folgt aus:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    # Import der Module
    import sys
    import os

    # 1-Wire Slave-Liste lesen
    file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
    w1_slaves = file.readlines()
    file.close()

    # Fuer jeden 1-Wire Slave aktuelle Temperatur ausgeben
    for line in w1_slaves:
    # 1-wire Slave extrahieren
    w1_slave = line.split("\n")[0]
    # 1-wire Slave Datei lesen
    file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
    filecontent = file.read()
    file.close()

    # Temperaturwerte auslesen und konvertieren
    stringvalue = filecontent.split("\n")[1].split(" ")[9]
    temperature = float(stringvalue[2:]) / 1000

    # Temperatur ausgeben
    print(str(w1_slave) + ': %6.2f C' % temperature)

    sys.exit(0)


    und wenn ich jetzt im Index.php folgendes stehen habe, geht nichts auf der www. Seite, ausser "hallo" , sonst keine Anzeige...

    <?php

    exec("/home/pi/1wire_read2.py", $output, $return_var);
    if (!empty($output)) {
    $temp = $output[0];
    }

    echo "$temp";
    echo "$temperature";

    echo $temp;
    echo $temperature;
    echo "Hallo";

    :helpnew::helpnew::helpnew::helpnew::helpnew::helpnew::helpnew:

  • > und wenn ich jetzt im Index.php folgendes stehen habe, geht nichts auf der
    > www. Seite, ausser "hallo" , sonst keine Anzeige...
    Eigentlich erstaunlich dass da ueberhaupt was steht.

    Kein einziges HTML-Element, kein End-Tag fuer die Processing Instruction ...

    Ach ja, die output-Variable ist ein Array, das gilt es auch zu beachten:

  • 1. Das Python Script führst du mit root Rechten aus, also mit sudo. Siehe dazu ggf Forumsuche nach: sudo webscript
    2. legst du in dem index.php nirgends die Variable $temperature fest, wie sollte das also was ausgeben?
    3. schließt du nirgends das <?php mit: ?>. Das Script dürfte also gar nicht auszuführen gehen


    Und ja, $output ist ein Array. Das erste Element im Array ist 0 also kriegt man die erste Zeile mit: $output[0]
    Da wir jetzt aber zum aller ersten mal das Python Script sehen und somit erfahren das er nicht nur EIN 1wire Sensor auslesen tut sondern alle, wird die Ausgabe nur der ersten Zeile nicht reichen.... Tja so ist das wenn man unzureichende Infos kriegt.

    Bitte versuch es mal mit exakt dem folgenden PHP Script:
    [code=php]
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>1 wire</title>
    </head>
    <body>
    <?php
    if (!file_exists("/sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count")) {
    echo "<b>ERROR: w1 Kernel Module not loaded?<br/>modprobe w1-gpio pullup=1<br/>modprobe w1-therm<br/></b>\n";
    } else if (file_get_contents("/sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count") === 0) {
    echo "<b>ERROR: No 1-wire Sensors connected?</b>\n";
    } else {
    $w1_slaves = file("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves");
    foreach ($w1_slaves AS $slave) {
    $lines = file("/sys/bus/w1/devices/".$slave."/w1_slave");
    if (preg_match("/t=(.*)/", $lines[1], $match)) {
    echo $slave.": ".$match[1]."<br/>";
    }
    }
    }
    ?>
    </body>
    </html>
    [/php]

  • Hallo,
    erstmal vielen dank, ich werde es ausprobieren.

    Ich dachte, es ist nicht so wichtig, das es mehrere Sensoren sind und wenn die
    erste Zeile geklappt hätte, hätte ich weiter probiert.
    Sorry dafür....

    ....ihr seht ich bin Änfänger, blutiger.... aber vielen liben Dank für die Hilfe.:thumbs1:

    Am Abend probiere ich es gleich aus...

    Gruss

  • Hallo,
    sodele,
    jetzt hab ich es exat so in die Index.Php reingesetzt.
    AUf der Web seite 192.168.0.10/Index.php kommt leider nüschts... ( nichts :thumbs1:)

    Wenn die 2 Module nicht gealden sind, dann die fehlermeldung, das geht... aber die 5 Werte
    erscheinen nicht. Pfade sind korrekt.

    Manno... :denker:

    Und nun....?

  • Hallo,
    bist du inzwischen weiter gekommen?
    Ich habe das versucht, nachzustellen, komme aber auch nicht weiter. Die Tabs habe ich händisch noch mal ausgerichtet, es kommt aber leider nichts an.

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Forumsuche nach: sudo webscript


    index.php

    Spoiler anzeigen

    [/spoiler]

    /var/sudowebscript.sh

    Spoiler anzeigen

Jetzt mitmachen!

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