Seite 1 von 1

Finally will nicht so wie ich will!

Verfasst: Donnerstag 16. November 2006, 14:53
von Python 47
Hi Leuts,

ich habe ein Programm und möchte das es, bevor es beendet wird noch ein anderes Programm aufruft. So jetzt dachte ich mir ich mach das mit finally und hab mir ein kleines Testprogramm geschrieben um zu testen ob das auch geht:

Code: Alles auswählen

import os
try:
   for x in range(100000):
      print x*x
finally:
   os.startfile('taskmgr.exe')
So wenn ich das Programm jetzt durch einen KeyboardInterrupt unterbreche, dann wird auch der Taskmanager gestartet, ist ja logisch. Aber wenn ich das Programm einfach so beende funktioniert das mit finally nicht.

Wie könnte man das lösen?

Danke!

Verfasst: Donnerstag 16. November 2006, 15:01
von BlackJack
Was heisst "einfach so beenden"? Wie machst Du das?

Verfasst: Donnerstag 16. November 2006, 15:17
von rolgal_reloaded
@BlackJack

ich dachte schon dass das ne blöde Frage wäre und habe sie mir verkniffen. :D

Schließe mich jetzt also an, und will das auch wissen :wink:

Verfasst: Donnerstag 16. November 2006, 15:49
von Python 47
Hey,

na einfach auf "x" drücken oder im taskmanager den Prozess beenden.

Verfasst: Donnerstag 16. November 2006, 15:55
von CM
Nun, wenn Du Python beendest, wird es Dir auch nicht mehr zu Diensten sein können. Oder verstehe ich das was falsch?

Gruß,
Christian

Verfasst: Donnerstag 16. November 2006, 15:58
von Python 47
Ja das ist mir schon klar, ich meinte auch eher, wenn ich eine exe mit py2exe erstellt habe und das dann beende.

Verfasst: Donnerstag 16. November 2006, 16:09
von birkenfeld
"beenden" ist relativ. Wenn du den Python-Prozess abschießt, kann natürlich kein finally mehr ausgeführt werden.

Du musst den Prozess immer von "innen" beenden, z.B. über eine Exception oder sys.exit().

Verfasst: Donnerstag 16. November 2006, 17:38
von Python 47
Hi Birkenfeld,

naja das eigentliche was ich will ist ja, das wenn das Programm aus irgendeinem Grund beendet wird, z.b. wenn der pc heruntergefahren wird, dass ich noch eine Datei erstellen kann. Wie ich das jetzt mitbekommen habe ist das nicht möglich oder?

Verfasst: Donnerstag 16. November 2006, 17:42
von birkenfeld
Nein, ist es mit finally zumindest nicht.

Unter Unix würde der Prozess zumindest ein "TERM"-Signal gesendet bekommen, das man mittels "signal" abfangen kann. Unter Windows: keine Ahnung.

Eventuell gibt es auch eine native API, sowas wie Services, die dann kontrolliert heruntergefahren werden.

Verfasst: Donnerstag 16. November 2006, 17:48
von Python 47
Danke, dann werd ich mir was anderes überlegen müssen. Viele Wege führen nach Rom! :lol:

Verfasst: Donnerstag 16. November 2006, 17:50
von Leonidas
birkenfeld hat geschrieben:Unter Unix würde der Prozess zumindest ein "TERM"-Signal gesendet bekommen, das man mittels "signal" abfangen kann. Unter Windows: keine Ahnung.
Ich denke das sollte doch mit atexit gehen, dass Prozesse die ein TERM geschickt bekommen noch atexit-Aufräumarbeiten starten. Das müsste man einfach mal testen.

Verfasst: Donnerstag 16. November 2006, 17:55
von Python 47
Kenn mich da nicht aus, kannst du evt. mal n Link oder infos schicken?

Danke!

Verfasst: Donnerstag 16. November 2006, 17:56
von birkenfeld
Wenn du die Funktion (oder gleich einen Wrapper für `atexit._run_exitfuncs`) als Handler für SIGTERM hinzufügst, ja. Sonst nicht.

So gehts:

Code: Alles auswählen

import atexit, signal

def exitfunc(*args):
    # *args, weil beim Aufruf durch atexit keine Parameter,
    # beim Aufruf durch signal zwei Parameter übergeben werden
    print "atexit"
atexit.register(gb)
signal.signal(signal.SIGTERM, gb)
signal.signal(signal.SIGKILL, gb)
# evtl. weitere

while 1:
    pass

Verfasst: Donnerstag 16. November 2006, 17:57
von Leonidas
Python Master 47 hat geschrieben:Kenn mich da nicht aus, kannst du evt. mal n Link oder infos schicken?
Naja, die Forensuche/Wiki-Suche/Internetsuche/Dokumentationssuche zu verwenden ist auch nicht so schwer: [wiki]Neue Features#Atexit[/wiki]

Verfasst: Donnerstag 16. November 2006, 21:14
von Python 47
Ok danke, das reicht mir. Den rest kann ich selber :)