Übergabe von Werten an anderes Script

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

    ich habe folgendes Problem: Ich möchte ein zweites Script aufrufen das für mich Daten aus einer MySQL Datenbank zieht und an das erste Script wieder übergibt. Soweit so gut.

    Aufrufen des zweiten Scriptes und auslesen der Datenbank funktionieren schon. Nur wie bekommen ich die ausgelesenen Daten nun zurück zum ersten Script?

    Meine Überlegung zu diesem war bisher das ich das zweite Script aufrufe und das erste beenden lassen und nach dem auslesen der Datenbank die Werte mittels sys.agrv[] übergeben lasse.

    Diese Lösung scheint mir nur ein wenig unpraktisch da das erste Script noch eine Reihe anderer Kontrollfunktionen übernimmt und diese bei jedem neustart wieder zurück gesetzt werden würden was in meinem Fall sehr unpraktisch wäre.

    Ich hoffe einer von euch hat eine Lösung für dieses Problem. Vielen Dank schon mal im voraus.

  • Wie führst du das 2.Script denn aus? Bitte poste mal beide Scripts (bitte in CODE)

    Ansonsten: aus dem 1.Script das 2.Script ausführen und die Rückgabe in eine Variable schreiben lassen welche dann weiter verarbeitet werden kann

  • Wie gesagt das ausführen des 2. Scriptes stellt kein Problem dar. Auch das auslesen der Datenbank ist kein Problem nur eben die Werte die zurückgegeben werden sollen sind noch ein Hinderniss.

    Einmal editiert, zuletzt von Gerald (22. Juni 2014 um 18:12)

  • Naja wieso benutzt du denn popen :huh: Du benötigst doch nur die Rückgabe und musst das nicht in Echtzeit ausgeben oder gar auch noch interaktiv damit hantieren? ;)

    Also die offensichtlichere Möglichkeit die hierbei ins Auge sticht wäre, anstatt:

    Code
    def execute():
        process = subprocess.Popen(["/python/terra/functions.py"], stdout=subprocess.PIPE)
        process.wait()

    das folgende zu nutzen:

    Code
    def execute():
        process = subprocess.call(["/python/terra/functions.py"])
        print(process)

    Dabei wird dir aber auch der Return-Code ausgegeben. 0 = erfolgreich und alles über 0 (also 1, 2 , 3 usw) = Fehler.

    Alternativ ginge auch:

    Code
    def execute():
        process = subprocess.check_output(["/python/terra/functions.py"])
        print(process)


    Ich komm aber auch noch mal auf dein popen zurück. Der korrekte Umgang für die Rückgabe des ausgeführten Befehls sähe wie folgt aus:

    Code
    def execute():
        process = subprocess.Popen(["/python/terra/functions.py"], stdout=subprocess.PIPE)
        print process.communicate()



    Quellen:
    https://docs.python.org/2/library/subprocess.html
    http://www.pythonforbeginners.com/os/subprocess-…-administrators

  • Ein anderes Script verwenden um Daten aus einer Datenbank auszulesen ist der Fehler. eine Datenbank ist dafür da, einfach Daten zu speichern und von einem Programm zu einem anderen zu bekommen ohne Konvertieren zu küssen.
    Richtig "Daten" zwischen Scripten hin und herschieben ist nicht. dafür speichert das eine Daten in eine datenbank und das andere ließt sie aus... Also Konzeptfehler.

    Wenn man so komplex wird, dass man auf mehrere Scripte aufteilt und ein eigenes Datenbankscript nutzt und so ist es DRINGEND Zeit eine Programmiersprache zu nutzen.

  • Das mag sein nur nutze ich das 2. Script um einen Absturz zu verhindern. Der Sensor der am Pi angeschlossen ist macht ab und zu Probleme und dann hat Python die Angewohnheit aus dem Script auszusteigen. Da es um die Überwachung meines Terrariums geht kann ich mir es leider nicht leisten das das ganze abstürzt und nichts mehr funktioniert.

    Wenn ich jetzt allerdings den Wert mit return zurückgeben lassen will bekommen ich nur None zurück.

    Einmal editiert, zuletzt von Gerald (22. Juni 2014 um 19:40)

  • Danke die letzte Lösung ist die beste. Die werde ich ich nehmen. Danke an alle für eure Hilfe und Unterstützung. (Hoffentlich kann ich das mal genauso gut wie Ihr)

  • Der Ansatz von Bootsmann ist elegant :thumbs1:. Wie meigraf schon schrieb muss man die Ergebnisse mit print über stdout in dem zweiten Script zurückgeben.

    Wenn man unbedingt - warum auch immer - das stimme ich Horroreyes zu - subprocess benutzen will, könnte man es wie folgt machen:
    passCommandArgs.py:


    passCommandArgs2.py:

  • Der beste Weg wäre wohl das Programmm so zu entwickeln, dass ein Sensorabsturz abgefangen wird. Wenn die Library dann blokiert das in einen anderen Prozess auslagern, wenn die Library dann Errorcodes oder Exceptions wirft die entsprechend Abfangen und drauf reagieren.

Jetzt mitmachen!

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