Funktion nach bestimmter Zeit beenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

Hallo zusammen,

ich habe folgendes Anliegen: ich verwende eine Funktion execute_mpolar, welche nach 60 Sekunden gekillt werden soll, falls
sie dann noch nicht vollständig durchgelaufen ist. Außerdem arbeite ich mit den gegebenen Rückgabewerten.
Zwar habe ich schon diverses zu diesem Thema gefunden, habe jedoch Probleme damit den Code so zu gestalten, dass ich noch
mit den Rückgabewerten arbeiten kann.

Code: Alles auswählen

def execute_mpolar(path, mpolar, airfoil_name):
    os.chdir(path)
    Eingabe_MPOLAR = mpolar + " " + airfoil_name
    [MPOLAR,MPOLARError] = subexecute("%s" % Eingabe_MPOLAR,True,None)
    return (MPOLAR,MPOLARError)

[MPOLAR,MPOLARError] = execute_mpolar(path, mpolar_program_link, airfoil_name)
Vielen Dank für jegliche Hilfe!
LG
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Europython: was macht denn subexecute? Benutze Popen aus dem subprocess-Modul direkt.
Den Pfad zu wechseln ist meist eine schlechte Idee, weil dadurch ein globaler Zustand geändert wird, der an anderer Stelle zu Problemen führen wird/kann. Wann Du + und wann Du % zur Stringverarbeitung benutzt ist seltsam (Zeile 3 wäre % angebracht, in Zeile 4 ist das Überflüssig).
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ich löse das mit Timer.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

@Sirius 3: Erstmal danke für den Hinweis bezüglich der Stringverarbeitung. Das habe ich gleich mal geändert, war in der Tat etwas umständlich...

Subexecute lautet folgendermaßen:

Code: Alles auswählen

def subexecute(args, shell_in=False, input=None):   #macht eine Eingabe und gibt einen Rueckgabewert zurueck
    if shell_in == False:
        args = shlex.split(args)
    else:
        pass   
    data = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=shell_in).communicate(input)
    output = data[0].rstrip()
    error = data[1].rstrip()
    if error != "":
        print "Error:", error,
    else:
        print output
    return output, error
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

Mit Timer habe ich es auch schon probiert, das hat aber leider nicht geklappt, weil ich das mit den Rückgabewerten
dann nicht mehr hinbekommen habe. Geht es vielleicht mit Multiprocessing? Problem ist, dass der Prozess, welcher zwischenzeitlich
ausgeführt wird in einem externen Programm abläuft...
BlackJack

@Europython: Was soll denn überhaupt zurückgegeben werden wenn das Programm abgebrochen wird? Dafür müsste man ja irgendwie eine `Timeout`-Ausnahme einführen.
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

@Black Jack: Je nachdem, ob das Programm bis dahin erfolgreich gelaufen ist die konsolenausgabe oder eine Fehlermeldung.
BlackJack

@Europython: Die Frage ist nicht was ausgegeben werden soll sondern was der Rückgabewert einer Funktion sein soll die abgebrochen wurde weil sie zu lange lief und deshalb gar keinen Rückgabewert hat.
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

Naja für den Fall reicht mir die Information, dass sie abgebrochen wurde.
Da ich ja aber in jedem Fall die gleiche Funktion verwende, muss ich doch auch mit den Rückgabewerten arbeiten,
da ich davor ja nicht weiß, ob die Funktion durchlaufen oder abgebrochen wird.
Verstehst du was ich meine?
Vielleicht stehe ich auch total auf dem Schlauch und es geht viel leichter. Das ist jedenfalls der Gedanke an dem ich bisher gescheitert bin.
BlackJack

@Europython: Na für genau so etwas sind Ausnahmen da. Die Funktion gibt entweder ein Ergebnis oder löst eine Ausnahme aus.
Europython
User
Beiträge: 16
Registriert: Samstag 11. Oktober 2014, 12:40

Kannst du mir helfen sowas zu implementieren?
Antworten