Interpreter Klonen

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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?
TUFKAB – the user formerly known as blackbird
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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. :?:
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Antworten