Seite 1 von 1

Interpreter Klonen

Verfasst: Sonntag 22. Januar 2006, 16:16
von mitsuhiko
Tja. Not to something completly different.

Ich möchte aus einem Python Programm den kompletten interpreter call wiederholen und dann den aktuellen Prozess dadurch ersetzen.

* user startet "python myfile.py runserver -q"
* myfile.py beendet sich selber und ruft wieder "python myfile.py runserver -q" auf

Wie bekomm ich das hin?

Verfasst: Sonntag 22. Januar 2006, 16:51
von modelnine
Unter *nix:

Code: Alles auswählen

import os
import sys

os.execlp("python","python",*sys.argv)
Ersetzt das momentane Runtime-Environment durch einen neuen Python-Interpreter, der die selben Argumente bekommt wie der letzte. Weitere Doku im os-Modul.

--- Heiko.

Verfasst: Sonntag 22. Januar 2006, 17:36
von mitsuhiko
hm. ich hab jetzt selber auch eine Lösung:

Code: Alles auswählen

        #snip
        import gc
        
        for obj in gc.get_objects():
            if hasattr(obj, '__del__'):
                try:
                    obj.__del__()
                except:
                    pass
        args = [sys.executable] + sys.argv
        os.execv(sys.executable, args)
        #snap
funktioniert, ist aber irgendwie in meinen augen ein arger hack.

Verfasst: Sonntag 22. Januar 2006, 19:05
von Mad-Marty
Ist ja faszinierend das das geht, und nicht erst der exec ausgeführt wird und danach der aufrufende Python Code weiterläuft.

Steht nichtmal in der Referenz wie ich sehe ;)
(bzw hab ich execlp nicht gefunden)


Wo macht sowas sinn ? Kann mir nämlich gerade nicht vorstellen wo man das einsetzen kann. :?:

Verfasst: Sonntag 22. Januar 2006, 19:16
von mitsuhiko
Mad-Marty hat geschrieben:Wo macht sowas sinn ? Kann mir nämlich gerade nicht vorstellen wo man das einsetzen kann. :?:
Im autoreloader Teil des Colubrid WSGI standalone webservers :wink:

Verfasst: Montag 23. Januar 2006, 07:28
von jens
Unter Windows hatte ich dafür einfach eine Batch Datei gemacht: http://www.python-forum.de/viewtopic.php?p=23597#23597
Unter Linux könnte man dafür doch ein sh Skript machen, oder?

Über einen returncode könnte man entscheiden, ob der Server wirklich per KeyboardInterrupt beendet wurde, wenn nicht, wird er neu gestartet...

Verfasst: Montag 23. Januar 2006, 08:45
von Leonidas
jens hat geschrieben:Unter Windows hatte ich dafür einfach eine Batch Datei gemacht: http://www.python-forum.de/viewtopic.php?p=23597#23597
Unter Linux könnte man dafür doch ein sh Skript machen, oder?
Klar - in Linux werden oft Scripte benutzt, die Server überwachen und neustarten wenn sie sterben - aber warum überhaupt so etwas machen, wenn es doch mit Python-Bordmitteln geht? Das hat den Vorteil, dass es unabhängig vom Betriebssystems funktioniert.. denn sonst müsstest du umabhängig voneinander Batchdateien und Shellscripte pflegen (btw, Batchscripte sind unangenehm zu programmieren).

Verfasst: Montag 23. Januar 2006, 08:48
von mitsuhiko
jens hat geschrieben:Unter Windows hatte ich dafür einfach eine Batch Datei gemacht: http://www.python-forum.de/viewtopic.php?p=23597#23597
Unter Linux könnte man dafür doch ein sh Skript machen, oder?

Über einen returncode könnte man entscheiden, ob der Server wirklich per KeyboardInterrupt beendet wurde, wenn nicht, wird er neu gestartet...
Weil ich dafür ein Skript anlegen muss. So wird automatisch jede Colubrid Anwendung zu einer Serveranwendung, auch ohne name Hook.

Code: Alles auswählen

from colubrid import BaseApplication
class Application(BaseApplication):
    def process_request(self):
        self.request.write("Hallo Welt")
app = BaseApplication
Startet automatische einen Standalone Server. Man braucht kein Skript mehr anlegen, einen Name Hook auch nicht.