2017-12-06 1 views
0

Ein Skript wird sowohl unter OS X als auch unter Windows mit einem virtualenv entwickelt. Die so genannte Entwickler hat bereits alle erforderlichen Pakete installiert eine requirements.txt Datei verwenden, aber ein Problem bleibt:austauschbare Shebang-Zeile im Python-Skript für Dual-Betriebssysteme?

Wenn das Skript auf OS X läuft, ist der Anfang jeder Python-Datei wie folgt beginnen muss:

#!/Users/os-x-username/.virtualenvs/some_env/bin/python 
#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe 

#!C:\Users\windows-username\Envs\some_env\Scripts\python.exe 
#!/Users/os-x-username/.virtualenvs/some_env/bin/python 

Wie können die so genannten Entwickler diese Langweiligkeit vermeiden:

Aber unter Windows, wenn der Entwicklung muss die Leitung Ordnung umgeschaltet werden?

+1

Windows erkennt den Shebang nicht, da es auf Windows-genehmigten FS keinen '+ x' Dateimodus gibt. Aus der Perspektive von Windows könnte es auch "#! Bob ist dein Onkel" heißen. – zwer

+0

@zwer: Naja von meiner (zugegebenermaßen sehr kleinen) Erfahrung (kann ich wohl auch eine Stackoverflow-Referenz finden), liegst du falsch. Wenn ich die Windows-Shebang-Zeile aus meinem Skript weglasse und versuche, sie unter Windows auszuführen, kann es zu Problemen kommen, dass Bibliotheken nicht gefunden werden oder ein Python nicht im Pfad gefunden wird. Wenn ich die Zeile zurücksetze, laufen die Skripts gut. – zerohedge

+0

Wie läuft es unter Windows? Verwenden Sie einen Unix-Emulator wie Cygwin? – Barmar

Antwort

1

Wenn Sie nichts dagegen haben zusätzliche Schritte hinzugefügt haben, können ou einen Launcher Skript launcher.py wie erstellen:

#!/usr/bin/env python 

import subprocess 
import sys 

if __name__ != "__main__": 
    print("This is a launcher. Please run only as a main script.") 
    exit(-1) 

INTERPRETERS = { 
    "win": r"C:\Users\windows-username\Envs\some_env\Scripts\python.exe", # Windows 
    "darwin": "/Users/os-x-username/.virtualenvs/some_env/bin/python", # OSX 
    "linux": "/home/linux-user/.virtualenvs/some_env/bin/python" # Linux 
    # etc. 
} 

TARGET_SCRIPT = "original_script_name.py" 

interpreter = None 
for i in INTERPRETERS: # let's find a suitable interpreter for the current platform 
    if sys.platform.startswith(i): 
     interpreter = i 
     break 
if not interpreter: 
    print("No suitable interpreter found for platform:", sys.platform) 
    exit(-1) 

main_proc = subprocess.Popen([interpreter, TARGET_SCRIPT] + sys.argv[1:]) # call virtualenv 
main_proc.communicate() # wait for it to finish 

exit(main_proc.poll()) # redirect the return code 

Da dieses Skript nur ist die original_script_name.py in der gewünschten Interpreter für die aktuelle Plattform zu laufen, es Egal, was sein Shebang ist - solange er einen Python-Interpreter auswählt, ist alles in Ordnung.

Es würde als Drop-In-Ersatz für Ihr Original-Skript (original_script_name.py) fungieren, also rufen Sie einfach launcher.py und es wird sogar die CLI-Argumente bei Bedarf umleiten.

+0

Das einzige, was ich über deine Antwort nicht verstehe, ist der erste Satz. Ich sehe wirklich keine zusätzlichen Schritte wirklich! Es wird nur diese Py-Datei anstelle dieser Py-Datei ausgeführt. Ein großes Dankeschön! – zerohedge

Verwandte Themen