Ich habe dieses Problem:
System A
läuft Ubuntu und benötigt Python 2.6
für eine Menge verschiedener Dinge.
Ich installierte Python 2.7
separat für System A
System B
hat Python 2.7
nativ.
Ich habe ein Python-Skript BLAH
, das #!/bin/env python
oben sagt.
Weiter unten führt es ein weiteres Skript SIGH
aus, das oben auch sagt: #!/bin/env python
.
BLAH
muss entweder auf System A
oder System B
ausgeführt werden, und es muss immer Python 2.7
----
Teil meiner bisherigen Lösung:
Haben Sie ein Wrapper-Skript, das zuerst versucht zu sehen, ob which python
auf Python 2.7 verweist
Wenn das in Ordnung ist, dann führe BLAH
mit diesem Pfad für Python aus.
Andernfalls probiere which python2.7
und verwende diesen Pfad, um BLAH
auszuführen, und füge diesen Pfad zu env PATH
hinzu.
Problem mit dieser Lösung ist:
On System A
(welches Python 2.7 separat installiert hat)
Wenn BLAH
ausgeführt wird, läuft es mit Python 2.7 wegen des Wrapper-Skripts, das ich geschrieben habe (okay, soweit ..)
Wenn BLAH
spawns SIGH
, SIGH
verwendet den Shebang, um Python im Pfad zu finden, und dann ist es in Schwierigkeiten, weil es nach Python in env
s PATH
sucht und nach python2.7
in suchen sollte der Weg.
Gibt es einen sauberen Weg, dieses Problem zu lösen?
Vielen Dank im Voraus!
Wenn Sie ein Skript haben, das eine bestimmte Python-Version benötigt, zum Beispiel 2.7, würde ich die erste Zeile in
ändern %Vor% Und dann stellen Sie sicher, dass python2.7
auf Ihrem Pfad ist (Sie müssen ggf. Symlinks hinzufügen). In allen Verteilungen, die ich verwendet habe, existieren diese symbolischen Verknüpfungen bereits.
(Tatsächlich ist python
typischerweise ein Symlink zu pythonX
, was ein Symlink zu pythonX.Y
oder in meinem Fall python -> python2 -> python2.7
ist.)
Sie müssen keinen vollständigen Pfad fest codieren, da dies von Distribution zu Distribution oder Box zu Box variieren kann.
Aber da es auf Ihrem Pfad namens python2.7
keine Unklarheit für eine ausführbare Datei geben sollte, sollten Sie in Ordnung sein, ohne sich um hartkodierende Pfade kümmern zu müssen.
Alternativ können Sie innerhalb des ersten Skripts den Python-Interpreter direkt aufrufen, wie in:
%Vor%statt
%Vor%BEARBEITEN Wie JF Sebastian in den Kommentaren bemerkt, könntest du sys. ausführbar im ersten Argument, um sicherzustellen, dass das zweite Skript an den gleichen Interpreter wie der erste übergeben wurde. z. B.
%Vor%Als Randnotiz, die nützlich sein kann oder nicht, können Sie auf die Version des "aktuellen" Python-Interpreters innerhalb des Skripts zugreifen, indem Sie
verwenden %Vor%, was nützlich sein kann, um festzustellen, ob der richtige Interpreter ausgeführt wird.
Was ich tun würde ist, zuerst den #!/bin/env
direkt in den python2.7
Pfad zu ändern, zum Beispiel: #!/usr/local/bin/python2.7
wird funktionieren.
Wenn sich der Pfad von System A und B python2.7 an verschiedenen Stellen befindet (was für Sie der Fall zu sein scheint), können Sie immer einen solchen Symlink erstellen:
%Vor%und es sollte gut funktionieren.
Dumm und einfach
In der Shell, falls nötig:
%Vor%Im Python-Skript:
%Vor%Ich habe diese Art von Problemen durchgemacht, und diese Lösung hat die meisten Fälle gelöst und war leicht von einem System auf ein anderes übertragbar (Sie könnten verschiedene Wege zwischen Systemen, verschiedenen Versionen der Software ... sehen). Erstellen Sie zuerst einen Symlink, um sicherzustellen, dass Sie die richtige Version von Python ausführen (dies gilt jetzt besonders, wenn Sie jetzt nie, wenn Python3 nur Python ist), und verlassen Sie sich dann auf das Bash-Env. Sie ändern also Ihr Skript nicht jedes Mal, wenn Sie ein System für ein Util-Skript anvisieren, das nicht den Aufwand eines Pakets erfordert.