Seite 1 von 1
Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 10:14
von Europython
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
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 10:26
von Sirius3
@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).
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 11:06
von darktrym
Ich löse das mit Timer.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 11:33
von Europython
@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
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 14:35
von Europython
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...
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 14:40
von 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.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 14:49
von Europython
@Black Jack: Je nachdem, ob das Programm bis dahin erfolgreich gelaufen ist die konsolenausgabe oder eine Fehlermeldung.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 14:51
von 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.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 15:18
von Europython
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.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 15:27
von BlackJack
@Europython: Na für genau so etwas sind Ausnahmen da. Die Funktion gibt entweder ein Ergebnis oder löst eine Ausnahme aus.
Re: Funktion nach bestimmter Zeit beenden
Verfasst: Montag 20. Oktober 2014, 16:07
von Europython
Kannst du mir helfen sowas zu implementieren?