sys.exit() und kontrolierte Objekt zerstoerung

Hi! Durch das cmd-Modul habe ich eine Endlosschleife("loop") die ich nur durch sys.exit() oder "Shift-d" beenden kann. Merkwürdigerweise wird dabei weder meine "def exitfunc():" gerufen, noch die __del__: der Objekte. Was schmerzhaft ist, weil sie sich eigentlich für den nächsten Programmaufruf "pöckeln" (pickel). Jetzt habe ich mich erst mal damit beholfen, selber die __del__ Funktionen aufzurufen bevor ich sys.exit() aufrufe. Aber ich glaube das dass so nicht gedacht war. Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Olaf 'Rübezahl' Radicke wrote:
Jetzt habe ich mich erst mal damit beholfen, selber die __del__ Funktionen aufzurufen bevor ich sys.exit() aufrufe. Aber ich glaube das dass so nicht gedacht war.
Die Doku sagt dazu: """It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.""" Dafür empfiehlt sich wohl die Verwendungs des Moduls 'atexit'. -- Regards Hartmut Goebel | Hartmut Goebel | We build the crazy compilers | | h.goebel@crazy-compilers.com | Compiler Manufacturer | _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On Tuesday 30 March 2004 19:43, Hartmut Goebel wrote:
Olaf 'Rübezahl' Radicke wrote:
Jetzt habe ich mich erst mal damit beholfen, selber die __del__ Funktionen aufzurufen bevor ich sys.exit() aufrufe. Aber ich glaube das dass so nicht gedacht war.
Die Doku sagt dazu: """It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits."""
Dafür empfiehlt sich wohl die Verwendungs des Moduls 'atexit'.
Funktioniert bei Shift-D aber auch nicht. Aber der Ärger scheint erst anzufangen... Ich habe festgestellt, das meine Thread's als Zombies nach Programmende weiter laufen. :-(. Ich weis nicht ob das auch mit dem cmd-Modul zu tun hat. Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On Wednesday 31 March 2004 06:24, Olaf 'Rübezahl' Radicke wrote:
On Tuesday 30 March 2004 19:43, Hartmut Goebel wrote:
Olaf 'Rübezahl' Radicke wrote:
Jetzt habe ich mich erst mal damit beholfen, selber die __del__ Funktionen aufzurufen bevor ich sys.exit() aufrufe. Aber ich glaube das dass so nicht gedacht war.
Die Doku sagt dazu: """It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits."""
Dafür empfiehlt sich wohl die Verwendungs des Moduls 'atexit'.
Funktioniert bei Shift-D aber auch nicht.
Aber der Ärger scheint erst anzufangen... Ich habe festgestellt, das meine Thread's als Zombies nach Programmende weiter laufen.
:-(. Ich weis nicht ob das auch mit dem cmd-Modul zu tun hat.
Beim studieren des cmd-Moduls habe eine (recht komplizierte) Lösung gefunden: 1.) Habe ich die Loop-Funktion überladen und wie volgt modifiziert: def cmdloop(self, intro=None): """Repeatedly issue a prompt, accept input, parse an initial prefix off the received input, and dispatch to action methods, passing them the remainder of the line as argument. """ self.preloop() if intro is not None: self.intro = intro if self.intro: print self.intro stop = None while not stop: if self.cmdqueue: line = self.cmdqueue[0] del self.cmdqueue[0] else: if self.use_rawinput: # ORIGINAL-CODE: # try: # line = raw_input(self.prompt) # except EOFError: # line = 'EOF' # MODIFIKATION-BEGIN try: line = raw_input(self.prompt) if line == "q" or "quit": self.postloop() break except : self.postloop() break # MODIFIKATION-END else: sys.stdout.write(self.prompt) sys.stdout.flush() line = sys.stdin.readline() if not len(line): line = 'EOF' else: line = line[:-1] # chop \n line = self.precmd(line) stop = self.onecmd(line) stop = self.postcmd(stop, line) self.postloop() 2.) Lasse ich jetz mein Thread (der auch eine Endlosschleife ist) in regelmäsigen Abständen einen Wert prüfen in einen Objekt, der sich verändert, wenn das Programm verändert wird. Geschieht das, wird die Endlosschleife verlassen und der Thread beendet sich geordnet. 3.) In der postloop-Funktion ist ein Befehl, der den Wert verändert der von Thread geprüft wird. Auf diese weise sind alle Endlosschleifen beseitigt worden. MfG Olaf _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Hartmut Goebel
-
Olaf 'Rübezahl' Radicke