Hilfe gesucht bei: Python Funktionsaufrufe und Übergabe von Variablen aus mehreren Skripten

  • Hi zusammen,

    momentan bin ich am Basteln einer Steuerung für eine meiner alten DSLRs zum Aufnehmen von Astrofotos.

    Dazu habe ich einen alten RPi 1 reaktiviert, auf dem Raspberry Pi OS lite und ein WebIOPi Server, sowie gphoto2 läuft.
    Der WebIOPi baut mir eine relativ leichtgewichtige Web-Oberfläche auf, die Zugriff auf die Pi-Hardware und Python Skripte bietet.
    Die Python Skripte können dann über USB die Kamera mit gphoto2 fernsteuern.

    Soweit funktioniert das auch schon "manuell". Also sprich: Klick auf nen Button im Webbrowser und die Kamera macht eine Aufnahme.

    Nun möchte ich mit ein paar weiteren Python Skripten eine komplette Fernsteuerung der Kamera über "gphoto2" aufbauen.
    Dazu müssen ein paar Daten von verschiedenen Python Modulen hin und her geschoben werden. Und da hängt es bei mir momentan.

    Ich habe also gerade 2 Module:
    helper.py (zum Testen, wie ich aus einem anderen Python Modul Funktionen aufrufen und Variablen übergeben bekomme)

    get_current_settings.py (liest später aus einer Textdatei die relevanten Infos der Kamera aus, die momentan hart codiert sind)


    Im ersten Schritt versuche ich den Batterieladestand der Kamera aus dem einen Skript ins andere zu bringen. Dazu solle in der helper.py entweder die Funktion list_all_config() (listet später alles auf) oder die Funktion get_config_batterylevel() aus der get_current_settings.py aufgerufen und Variablen zurück an die helper-py übergeben werden.

    Das Aufrufen der Funktionen klappt super. Aber ich bekomme den Wert der Variable batterylevel nicht mit 123 rückgemeldet, sondern stets mit dem Initialwert 0 - egal, ob ich aus dem Helfer-Skript die Funktion get_config_batterylevel direkt aufrufe, oder sie über die Funktion list_all_config aufrufen lasse.

    Die Ausgabe ist immer:

    Code
    pi@raspberrypi:~/Astro/WebIOPi-Astro/python $ python3 helper.py
    Getting battery level...
    0
    pi@raspberrypi:~/Astro/WebIOPi-Astro/python $


    Wird hier die Variable verschattet? Und wie bekomme ich den von mir erwarteten (und ja auch in der Funktion get_config_batterylevel zugewiesenen) Wert 123 in mein Helfer-Skript gelesen?

    Danke euch schonmal für etwas Erhellung hier.

    Gruß!

    OpenELEC 5.0 Final (5.0.7 / 5.0.8 github) | SolidRun CuBox-i4Pro (CPU: ARM Cortex A9 | GPU: Vivante GC2000)
    Kein kodi.log => Kein Support! | Spendier' mir ein Bier!

    Einmal editiert, zuletzt von root2 (2. April 2022 um 11:24)

  • Und wie bekomme ich den von mir erwarteten (und ja auch in der Funktion get_config_batterylevel zugewiesenen) Wert 123 in mein Helfer-Skript gelesen?

    wie erfolgt denn in den im Script get_current_settings die Rückgabe der Werte? Der direkte Zugriff via get_current_settings.batterylevel dürfte nicht funktionieren. Der Punkt vor batterylevel wird in Python als Funktionsverkettung interpretiert. Die Rückgabe der Variablen batterylevel muss m.E. via return erfolgen.
    /R

  • wenn man sich nicht mit dem Geltungsbereich von Variablen herumschlagen will und die Anzahl relativ klein ist, könnte man auch die Werte auf Datenträger speichern / lesen.
    /R

  • Du ermittelst zwar mit get_config_batterylevel() den Wert (bzw. setzt ihn), gibst ihn aber nicht aus der Funktion zurück. Der Wert 123 verbleibt sozusagen in der Funktion.

    Code
    def list_all_config():
        batterylevel = get_config_batterylevel()

    und

    Code
    def get_config_batterylevel():
        return 123

    int(123) ist übrigens immer 123. Einen Integerwert nochmal nach Integer zu konvertieren, macht keinen Sinn. Python selbst kennt auch diese Form der Initialisierung nicht. Nennt sich "loose Typing"

    Code
    a = "Hallo Welt"
    b = 123


    a ist immer String, b immer Integer (Python 2.xx) bzw. Float (ab Python 3).

    EDIT: Hui, ganz schön was los hier, alle Expörden versammelt ;)

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Danke für eure tolle Hilfe!

    Eine Übergabe per Dateisytem wäre möglich, möchte ich aber verhindern.

    Laut diesen Snippets hier, sollte eine Übergabe der Variablen auch ohne explizites return möglich sein (und in meinem Fall vermutlich sogar ziemlich sinnvoll, da ja so ggf. auch mehrere Variablen abgefragt werden können):
    https://stackoverflow.com/questions/4571…-file-in-python
    https://stackoverflow.com/questions/1725…om-another-file
    https://www.delftstack.com/de/howto/pytho…m-another-file/

    Ich schätze, dass im "Endzustand" des Projekts vermutlich ca. 10 Variablen auf die oben beschriebene Art und Weise zur Verfügung stehen werden (sollen). Batterieladestand, Blende, Verschlusszeit, ISO, Bildformat, Bildgröße, etc.

    Im Zweifelsfall muss ich dann vermutlich versuchen, die einzelnen Variablen in der helper.py eine nach der anderen zusammen zu klauben, anstatt sie in der get_current_settings.py in einem Rutsch zu erfassen.

    Oder ich lese mich mal in Klassen ein, was man mit denen reißen kann :)

    Seufz, noch eine Sprache mehr zu lernen - aber ist ja schön, wenn man multilingual unterwegs ist :)

  • Mit return kannst Du alles mögliche zurückgeben (Tupel, Array, Dictionary, Objekt), da bist Du nicht auf eine einzelne Variable beschränkt.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Mit return kannst Du alles mögliche zurückgeben

    Danke, das hat sehr geholfen!

    Ich mach es jetzt mit einer Klasse "camera", die eine Data Class (struct) enthält. So kann ich in der camera-Klasse die einzelnen Werte sauber in getrennten Funktionen erstellen, per "Sammelfunktion" in einem Rutsch in die Data Class schreiben lassen und kann aus dem Helfer-Modul nach Instanziierung eines Objekts der camera-Klasse auf jedes einzelne Datenfeld der Data Class zugreifen.

    Edit: Uns spaßeshalber hab ich die Enzelwerte per return auch noch eingebaut :)

    OpenELEC 5.0 Final (5.0.7 / 5.0.8 github) | SolidRun CuBox-i4Pro (CPU: ARM Cortex A9 | GPU: Vivante GC2000)
    Kein kodi.log => Kein Support! | Spendier' mir ein Bier!

    Einmal editiert, zuletzt von root2 (2. April 2022 um 16:07)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!