Umgang mit mehreren Python-Versionen, wenn Python-Dateien #! / bin / env python verwenden müssen

8

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

ausgeführt werden

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

    
dana 03.07.2012, 21:47
quelle

4 Antworten

9

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.

    
jedwards 03.07.2012, 22:21
quelle
3

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.

    
Hassek 03.07.2012 22:00
quelle
2

Warum nicht virtualenv verwenden? Es erlaubt Ihnen, jede installierte Python-Version (neben anderen Sachen) zu benutzen ...

%Vor%     
starenka 03.07.2012 22:41
quelle
0

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.

    
Alex C. 02.07.2017 17:34
quelle

Tags und Links