Seite 1 von 1

Sich selbst neustarten

Verfasst: Montag 4. Oktober 2004, 12:49
von Vortec
Hallo,

habe folgendes Problem:
Ich will das eigene Pythonscript neustarten, das heisst, wenn Codeänderungen vorgenommen wurden, dass diese übernommen werden.
Bisher habe ich noch keine saubere Lösung dafür gefunden.
Auf irgendwelche Systembefehle möchte ich ungern zurückgreifen, da ich sehr auf Plattformunabhängigkeit achte.

Vielen Dank im Vorraus,
Vortec

Verfasst: Montag 4. Oktober 2004, 13:48
von Dookie
Hi Vortec,

ich habs noch nicht versucht, aber das sollte doch mit os.exec* gehen

Code: Alles auswählen

#/usr/bin/env python

import os
import sys


print "Irgendwas"
rawinput("Enter druecken um neu zu starten ")
os.execvp("python", sys.argv) #starte python neu,  argumente = Scriptname ...

Gruß

Dookie

Verfasst: Mittwoch 6. Oktober 2004, 10:49
von Vortec
Naja, eigentlich wollte ich ja auf Systembefehle verzichten.

Warum? Weil der Befehl zum Aufrufen unterschiedlich ist.

So funktioniert z.B. unter Windows:
- script.py
- c:\python24\python.exe script.py
Und unter Linux:
- python script.py
- python2.4 script.py
. ./script.py (wenn chmod +x und erste Zeile mit #!/ beginnt)

Allein das sind gerade mal 5 Möglichkeiten ein Pythonscript zu starten.
Den User den Pfad eintragen zu lassen ist mir zu unsauber.

Aber trotzdem danke für die Mühe!
Sonst noch Vorschläge?

Verfasst: Mittwoch 6. Oktober 2004, 13:09
von pSy
hmm... also das mit dem Pfad müsste auch vom Script aus zu lösen sein.
Irgendwie so:

Code: Alles auswählen

 import os.path,sys
print os.path.dirname(sys.argv[0])

Verfasst: Mittwoch 6. Oktober 2004, 13:46
von joerg
Hallo Vortec,

es wird immer eigenwillige Aufrufmöglichkeiten geben, die so ein Ansatz nicht ganz abdeckt. Folgendes sollte aber für viele Fälle funktionieren:

- den Pythoninterpreter selbst bekommst Du über sys.executable

- das Hauptskript bekommst Du auch für schwierige Fälle über:

Code: Alles auswählen

p = sys.argv[0]
if not os.path.isabs(p):
    p = os.path.normpath(os.path.join(os.getcwd(), p))
myself = os.path.realpath(p)
Wenn Du nun noch sys.argv auf irgendwelche weiteren Parameter auswertest, kannst Du Dir eine funktionstüchtige Kommandozeile zusammenbauen, auch wenn es nicht unbedingt die originale ist.

Keine Gewähr, hauptsächlich unter Linux getestet!

Jörg

Verfasst: Sonntag 10. Oktober 2004, 17:25
von Vortec
Die Lösung sieht doch sehr schick aus, danke dafür!