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

Finally will nicht so wie ich will!

Beitragvon Python 47 » Donnerstag 16. November 2006, 14:53

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

Beitragvon BlackJack » Donnerstag 16. November 2006, 15:01

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

Beitragvon rolgal_reloaded » Donnerstag 16. November 2006, 15:17

@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

Beitragvon Python 47 » Donnerstag 16. November 2006, 15:49

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:

Beitragvon CM » Donnerstag 16. November 2006, 15:55

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

Beitragvon Python 47 » Donnerstag 16. November 2006, 15:58

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

Beitragvon birkenfeld » Donnerstag 16. November 2006, 16:09

"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

Beitragvon Python 47 » Donnerstag 16. November 2006, 17:38

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

Beitragvon birkenfeld » Donnerstag 16. November 2006, 17:42

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

Beitragvon Python 47 » Donnerstag 16. November 2006, 17:48

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



Thomas :-)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 16. November 2006, 17:50

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

Beitragvon Python 47 » Donnerstag 16. November 2006, 17:55

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

Beitragvon birkenfeld » Donnerstag 16. November 2006, 17:56

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 16. November 2006, 17:57

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

Beitragvon Python 47 » Donnerstag 16. November 2006, 21:14

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



Thomas :-)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], brainstir