2017-02-21 2 views
0

Ich bin ein Python-Programm auf einem Server ausgeführt wird, und auf meinem Konto auf dem Server habe ich die Python-Version in .bashrc wie folgt festgelegt:Neustart von Python-Skript innerhalb Skript mit dem gleichen Python-Version

alias python="python2.7" 

Ich habe ein Python-Skript, das ich gerne selbst neu starten könnte. Es funktioniert gut lokal, aber wenn ich es auf dem Server neu starte, funktioniert es einmal und wechselt dann zu einer anderen Version von Python. Ich habe die folgende Funktion:

def restartScript(self): 
    print("Restarting server") 
    print(sys.executable,['python']+sys.argv) 
    os.execv(sys.executable,['python']+sys.argv) 

Das erste Mal, wenn ich versuche, es neu zu starten, gibt der folgende:

/usr/local/bin/python2.7 ['python', 'server.py'] 

jedoch das zweite Mal, dass ich den Server laufen, druckt es die folgenden:

/usr/local/bin/python ['python', 'server.py'] 

Dies gibt auch einen Fehler, weil ich ein Modul verwende, das für /usr/local/bin/python2.7 installiert ist, aber nicht für/usr/local/bin/python installiert ist.

Gibt es einen einfachen Weg, um sicherzustellen, dass der Server immer mit/usr/local/bin/python2.7 neu startet? Ich möchte es flexibel machen, damit jemand diesen Neustart benutzen kann, ob er seine Standardversion von Python in .bashrc definiert hat oder eine virtuelle Umgebung benutzt. Würde es auch funktionieren, wenn sie Python 3 oder Python 2 verwenden.

+0

Mögliches Duplikat [Zwei Versionen von Python auf Linux. wie man 2.7 zum Standard macht] (http://stackoverflow.com/questions/19256127/two-versions-of-python-onlinux-how-to-make-2-7-the-default) – Elodin

+0

Ich würde gerne um es so flexibel zu machen, dass jemand diesen Neustart benutzen kann, egal, ob sie ihre Standardversion von Python in .bashrc definiert haben (wie ich oben habe) oder eine virtuelle Umgebung benutzen. – user1763510

Antwort

0

Ich habe das Gefühl, dass ich etwas missverstanden habe, aber ich denke, Sie möchten 'python2.7' als erstes Element Ihrer Liste der Argumente anstelle von 'python' übergeben. Oder, wenn Sie nicht sicher sind, was der Name der ausführbaren Datei sein wird, übergeben Sie sys.executable.

+0

Ich möchte es flexibel machen, so dass es funktioniert, wenn der Benutzer auch eine andere Version von Python verwendet. Wenn ich os.execv (sys.executable, ['python'] + sys.argv) in os.execv (sys.executable, [sys.executable] + sys.argv) ändere, bekomme ich immer noch das gleiche Verhalten wie oben beschrieben. – user1763510

+0

ungerade. Ich habe gerade versucht, lokal, und ändern, um sys.executable als das erste Element der Liste zu verwenden. Es ist schwer zu sehen, wie es Ihr/usr/loca/bin/python überhaupt finden würde, wenn Sie niemals die ausführbare Python-Datei in execv erwähnen würden. – happydave

+2

Es funktioniert auch für mich vor Ort. Ich glaube, das hat mit der Tatsache zu tun, dass os.execv in einer Shell ausgeführt wird, die die .bashrc-Datei nicht verwendet. – user1763510

0

Die folgenden Werke unabhängig davon, welche Python-Version Sie verwenden:

os.execv(sys.executable,[sys.executable.split("/")[-1]]+sys.argv) 
Verwandte Themen