Finally will nicht so wie ich will!

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
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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!
mfg

Thomas :-)
BlackJack

Was heisst "einfach so beenden"? Wie machst Du das?
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@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:
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hey,

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

Thomas :-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Nun, wenn Du Python beendest, wird es Dir auch nicht mehr zu Diensten sein können. Oder verstehe ich das was falsch?

Gruß,
Christian
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Ja das ist mir schon klar, ich meinte auch eher, wenn ich eine exe mit py2exe erstellt habe und das dann beende.
mfg

Thomas :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

"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().
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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?
mfg

Thomas :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Danke, dann werd ich mir was anderes überlegen müssen. Viele Wege führen nach Rom! :lol:
mfg

Thomas :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Kenn mich da nicht aus, kannst du evt. mal n Link oder infos schicken?

Danke!
mfg

Thomas :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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
Zuletzt geändert von birkenfeld am Donnerstag 16. November 2006, 17:58, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Ok danke, das reicht mir. Den rest kann ich selber :)
mfg

Thomas :-)
Antworten