Wie kann ich unter Python scripte einbinden ?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich könnte eure Hilfe gebrauchen. Für mich ist es ein kleines Problem, aber für euch hoffentlich nicht. Denn mit Python habe ich noch nicht so viel Erfahrung.
    Es geht mir darum, das ich mehrere Scripte habe die immer die gleichen Funktion benutzen.
    Das ist einmal Variablen aus einer Datei auslesen bez. schreiben. Diese werden bearbeitet und dann wieder gespeichert.
    Das Ein und Auslesen wollte ich jetzt auslagern, so das ich das nicht jedesmal neu schreiben muss.

    HS100_Lesen.py

    HS100_Schreiben.py

    HS_100_Steuern.py

    Mein Problem besteht darin, ich möchte am Aanfang dieses Script das die Variablen eingelesen werden über HS100_Lesen.py und am Ende des Script die Variablen wieder gespeichert werden HS100_Schreiben.py

    Das ist mein Problem da ich nicht weiß wie das gemacht wird, und im Internet konnte ich auch nichts passendes finden.
    Oder ist das mit Phyton so nicht möglich. Denn für PHP  gibt es ja den Befehl include der genau das macht was ich hier gerne möchte.

  • Mit Python macht man das etwas anders:

    * pack Lesen und Schreiben je in eine Funktion (read_data und write_data)

    * setz die beiden Fuktionen in ein File namens read_write.py

    * import read_write in Steuern.py

    * rufe an passender Stelle read_data und write_data auf


    Code
    def read_data():
        print( "Reading the data" )
        return "data"
    
    def write_data( data ):
        print( "Writing the data:", data )


    Code
    import read_write
    
    data = read_write.read_data()
    
    read_write.write_data( data )

    Edited once, last by Tell (July 9, 2024 at 9:03 PM).

  • Ein ganzes Modul einzubinden ist zwar möglich, es ist aber besser, dafür Funktionen zu verwenden. Dadurch wird dein Programm modularer. Wenn du die Funktionen in eine eigene Datei packst, kannst du sie mit import in dein Hauptprogramm hinzuladen. Die Dateien nennt man dann Module.

    Die output-Variablen sind dann in der Funktion fürs Lesen return-Werte (da kannst du mehrere mit einem Komma getrennt angeben) und in der Funktion fürs Schreiben Parameter. Da das aber ziemlich viele Parameter bzw. return-Werte sind, ist es besser, dafür eine Klasse (am besten eine dataclass) zu benutzen.


    In Python ist es best practise, auch das Hauptprogramm in eine Funktion zu schreiben und diese dann nur auszuführen, wenn das Programm auch direkt gestartet und nicht importiert wurde:

    Python
    def main():
    	cmdargs = str(sys.argv)
    	...
    	
    if __name__ == '__main__':
    	main()
  • Danke für eure schnelle Hilfe.

    Die Version von Tell da habe ich noch 2 Probleme. Das Einbinden habe ich soweit vorstanden.
    In read_write.py habe ich ja die einzelnen variablen outputXX die ich einmal aus der temporären Datei auslesen und speichern möchte.

    Nur wie komme ich nach data = read_write.read_data() an die einzelnen Variablen.
    Und unter read_write.write_data( data ) wie übergebe ich die Variablen, damit die temporär gesteiechert werden kann.

  • Da du ziemlich viele Werte hast, würde ich dafür eine (Data-)Klasse nehmen:

  • bennetr
    Habe die Scripte nach deinen Vorschlag umgeschrieben.
    Nur mit das Hauptscript Steuern.py habe ich noch etwas Probleme.
    Bin mir nicht so sicher ob es richtig ist, wie ich es gemacht habe.
    Das Script selber funktioniert. Aber nach dem Einfügen in Steuern.py gibt es Fehlermeldung.

    read_write.py

    steuern.py

    Ich bekomme bei der Zeile 15 eine Fehlermeldung

    Code
        ON = 'AAAAKtDygfiL/5r31e+UtsWg1Iv5nPCR6LfEsNGlwOLYo4HyhueT9tTu36Lfog=='
    IndentationError: unexpected indent
  • Anders als PHP benutzt Python keine geschweiften Klammern, sondern Einrückungen, um Blöcke zu trennen. Das heißt, wenn du eine Funktion oder Klasse definierst oder ein if-Statement hast, muss der Code, der dazu gehört, um 4 Leerzeichen (es können auch mehr oder weniger sein, es ist nur wichtig, dass es überall die gleiche Anzahl ist. Tabs gehen auch, aber die Konvention ist 4 Leerzeichen) eingerückt sein.

    In Zeile 12 startest du direkt mit 8 Leerzeichen nach dem def (was wie gesagt funktioniert, aber unschön ist), die nächste wirksame Zeile (Zeile 15) hat aber 2 Leerzeichen mehr.

    Ich empfehle dir, eine Python-IDE, z.B. PyCharm Community oder VS Code mit den Python-Extensions, zu benutzen. Da werden solche Fehler direkt im Editor angezeigt.

  • Hallo,

    ich finde das sehr unübersichtlich.

    Dateien öffnet man mit dem `with`-Statement, dann wird die Datei auch im Fehlerfall wieder geschlossen. Dann muss man nicht 100 mal `readline` schreiben und das an nichtssagende Namen `output40` etc. binden. `readlines` gibt eine Liste mit allen Lines aus. Da du schon `pathlib` importiert hast, es aber nicht nutzt, es aber solltest, kannst du `read_text` verwenden. Darauf `splitlies` angewendet, ergibt ebenfalls eine Liste mit den Lines.

    Dann kann man in einer Schleife, mit `map` noch die `\n` entfernen und hat eine Liste mit allen Daten.

    Die Orte, die es zu steuern gibt gehören in eine Liste als Konstante definiert.

    Als nächsten kann man aus den zwei Listen ein Wörterbuch erstellen, so hat man zu dem ausgelesenen Status gleich die Bezeichnung und muss nicht mehr suchen, was den `output40` sein soll. Wichtig dabei ist, das man sicherstellen muss, dass die Listen gleich lang sind.

    Dann ist es auch schön in einer Schleife einfach durch das Wörterbuch zu gehen, um die Daten wieder zu schreiben. Das würde ungetestet so aussehen:


    Was machst du denn noch mit der `HS_100_dat` Datei, damit du die Funktionen sonst noch wo benötigst? Irgendwer muss nach diesem Skript die Datei wieder abändern?


    Grüße

    Dennis


    P.S. ich sehe gerade, dass der Code eventuell nicht ganz verständlich für dich sein könnte. Aber was du dennoch daraus sehen kannst, ist das es ganz wichtig ist, dass du dich mit Listen und Wörterbücher vertraut machst. Klassen würde ich noch weiter hinten anstellen und Typ-Annotationen ganz weg lassen.

    🎧 Jetzt sitzt du den ganzen Tag zu Hause und gespannt
    wartest du darauf, dass irgendwas passiert.
    Wenn ich mal huste, klopft es gleich an der Wand,
    "Bist damals auch auf Socken in Polen einmarschiert?!" 🎧

  • kann man aus den zwei Listen ein Wörterbuch

    [...]

    dass du dich mit Listen und Wörterbücher vertraut machst

    Ein Vorschlag:

    Es ist zwar (vielleicht) hilfreich für Anfänger, (zusätzlich) die ins Deutsche übersetzten Begriffe zu verwenden.
    Aber die eigentlich korrekten Bezeichnungen "list" und "dictionary" sollten besser auch erwähnt werden...

  • Dennis89

    Ja Dennis, da hast du Recht. Dein Code ist mir nicht so verständlich. So tief stecke ich in Python noch nicht drin.
    Ich hatte angenommen das es wie in PHP den Befehl include auch in Python gibt.
    Da es nicht so ist, muss ich mich noch etwas ein Python einarbeiten,

    Quote

    Was machst du denn noch mit der `HS_100_dat` Datei, damit du die Funktionen sonst noch wo benötigst? Irgendwer muss nach diesem Skript die Datei wieder abändern?

    Ich habe einen Raspberry für Haus und ein für den Garten. Einen dritten benutze ich als Monitor, der mir alles auf einen Bildschirm anzeigt.
    Den ersten und zweiten Raspberry kann ich über PC und Handy steuern. Den Monitor über den Bildschirm.

    Um Zeitnah beim betätigen eines Button die Änderung Anzeigen zu können werden die Steckdosen jede sek. abgefragt.
    durch die ständige Erweiterung bekomme ich langsam Probleme mit der Abfrage der Steckdosen.

    Deswegen möchte ich das jetzt ändern, das jetzt nur noch jede Minute abgefragt wird. Damit die Optische Anzeige aber Zeitnah erfolt, soll die Abfrage jetzt gespeichert werden in der Datei HS100.dat.
    Beim Betätigen eines Button soll die Ämderung gleichzeitig in der HS100.dat geändert werden. Die HS100.dat kann ich weiter hin im sekunden Takt abfragen.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!