Wie weise ich ein Python-Skript an, eine bestimmte Version zu verwenden?

76

Wie kann ich Python im main.py-Modul (vermutlich) mitteilen, welcher Interpreter verwendet werden soll? Was ich meine ist: Wenn ich möchte, dass ein bestimmtes Skript Version 3 von Python verwendet, um das gesamte Programm zu interpretieren, wie mache ich das?

Bonus: Wie würde sich dies auf eine virtuelle Umgebung auswirken? Habe ich Recht, wenn ich eine virtuelle Umgebung für mein Programm erstelle und es dann anweise, eine andere Version von Python zu verwenden, kann es zu Konflikten kommen?

je suis
quelle

Antworten:

52

Sie können eine Shebang-Zeile am oberen Rand des Skripts hinzufügen:

#!/usr/bin/env python2.7

Dies funktioniert jedoch nur, wenn es als ausgeführt wird ./my_program.py.

Wenn Sie als ausführen python my_program.py, wird die zurückgegebene Python-Version which pythonverwendet.

In re: to virtualenv verwenden Sie: virtualenv -p /usr/bin/python3.2oder was auch immer, um es für die Verwendung dieser ausführbaren Python-Datei einzurichten.

Jon Clements
quelle
10
Um diese Antwort zu vervollständigen, könnte es sich lohnen, die entsprechende She-Bang-Syntax zu beschreiben, da die Frage so formuliert ist, dass dieses Wissen nicht impliziert wird.
JBentley
Was ist, wenn der Weg für den Schebang zu lang ist? Es erlaubt nur 128 Zeichen. Sollten wir in einigen einen Alias ​​für Python festlegen install.py?
Lukas
53

Vielleicht nicht genau das, was Sie gefragt haben, aber ich finde es nützlich, dies zu Beginn meiner Programme zu setzen:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
Schwerkraftgrab
quelle
Ist der Bracket-Style-Funktionsaufruf nicht neu in Python3? Funktioniert dieser Code in allen Python-Versionen wie erwartet?
TamaMcGlinn
1
@TamaMcGlinn Ich weiß nicht genau, was du damit meinst. Die [0] bedeutet, dass auf den ersten Eintrag im Array verwiesen wird (was in diesem Fall die erste Ziffer der Python-Version bedeutet, z. B. in 2.7.3 wäre dies 2), ohne dass ein Funktionsaufruf ausgeführt wird. AFAIK dies funktioniert in allen Versionen von Python.
Gravity Grave
Der Grund, warum ich den Unterschied zwischen python2 und python3 herausgefunden habe, ist der Versuch, die print "hello world"Kompilierung durchzuführen . Ich denke, es ist nur die Druckaussage selbst, die sich geändert hat, daher meine Verwirrung. Vielen Dank für die Klarstellung, dass dies in allen Versionen von Python funktioniert, da dies unerlässlich ist.
TamaMcGlinn
21

Ich würde den Shebang #!/usr/bin/python (erste Codezeile) mit der Seriennummer von Python am Ende verwenden;)

Führen Sie dann die Python-Datei als Skript aus, z. B. ./main.pyüber die Befehlszeile und nicht über die Befehlszeile python main.py.

Dies ist auch dann der Fall, wenn Sie Python über eine Linux-Befehlszeile ausführen möchten.

Andrew
quelle
7
Also, wenn ich Python 2.7.3 wollte, würde ich #! / Usr / bin / python2.7.3
jesuis
@ MikeHalpin schau dir an, was in deinem / usr / bin ist. Sie müssen auf eine vorhandene ausführbare Datei verweisen. Wenn Sie 2.7.3 installiert haben, dann glaube ich, dass Sie richtig wären.
Endophage
Nicht, dass es einen Grund geben sollte, 2.7.3 spezifisch anzugeben - alle 2.X sollten größtenteils kompatibel und 2.7.X vollständig sein.
Erik
Ja, so wie python2.7 filename.py für alle / alle Python 2.7.x-Versionen
geekidharsh
2
Beachten Sie, dass dies nicht funktioniert, wenn Sie das Skript wie gewohnt ausführen, wenn Sie ein Python-Skript ausführen, dh indem Sie es python <python-file>vom Terminal aus ausführen .
HelloGoodbye
13

Während das OP möglicherweise auf einer Nix-Plattform arbeitet, könnte diese Antwort Nicht- Nix-Plattformen helfen . Ich habe den Shebang-Ansatz in Microsoft Windows noch nicht erlebt.

Umformuliert: Die Shebang-Zeile beantwortet Ihre Frage " innerhalb meines Skripts ", aber ich glaube nur für Unix-ähnliche Plattformen. Obwohl es die Unix-Shell außerhalb des Skripts ist, die die Shebang-Zeile tatsächlich interpretiert, um zu bestimmen, welche Version des Python-Interpreters aufgerufen werden soll. Ich bin nicht sicher, aber ich glaube, dass die Lösung das Problem für Benutzer der Microsoft Windows-Plattform nicht löst.

In der Microsoft Windows-Welt können Sie die Ausführung einer bestimmten Python-Version ohne Umgebungsvariablen, die speziell für jede installierte Python-Version eingerichtet wurden, vereinfachen, indem Sie der Datei python.exe den Pfad voranstellen, von dem aus Sie sie ausführen möchten, z C: \ Python25 \ python.exe mymodule.py oder D: \ Python27 \ python.exe mymodule.py

Sie müssen jedoch die Umgebungsvariablen PYTHONPATH und andere PYTHON ... berücksichtigen, die auf die falsche Version der Python-Bibliotheken verweisen.

Beispielsweise könnten Sie Folgendes ausführen: C: \ Python2.5.2 \ python.exe mymodule

Die Umgebungsvariablen können jedoch auf die falsche Version als solche verweisen:

PYTHONPATH = D: \ Python27

PYTHONLIB = D: \ Python27 \ lib

Jede Menge schrecklicher Spaß!

Ein nicht virtueller Weg in Windows wäre daher die Verwendung einer Batchdatei, die die Umgebung einrichtet und eine bestimmte ausführbare Python-Datei aufruft, indem der python.exe der Pfad vorangestellt wird, in dem sie sich befindet. Auf diese Weise erhalten Sie zusätzliche Details zu verwalten; Verwenden Sie beispielsweise Befehlszeilenargumente für den Befehl "start" oder "cmd.exe", um die "Konsolen" -Umgebung zu speichern und zu ersetzen, wenn die Konsole nach dem Beenden der Anwendung erhalten bleiben soll.

Ihre Frage lässt mich glauben, dass Sie mehrere Python-Module haben, von denen jedes eine bestimmte Version von Python erwartet. Dies kann "innerhalb" des Skripts lösbar sein, indem ein Startmodul vorhanden ist, das das Unterprozessmodul verwendet . Anstatt mymodule.py aufzurufen , würden Sie ein Modul aufrufen, das Ihr Modul aufruft. vielleicht launch_mymodule.py

launch_mymodule.py

import sys
import subprocess
if sys.argv[2] == '272':
  env272 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = {
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', }
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

Ich habe das nicht getestet.

DevPlayer
quelle
1
Hier ist ein MS-Batch-Skript, nicht virtuell, sicher Python- Versionsprüfung vor dem
DevPlayer
@ DevPlayer Ausgezeichnetes und erklärendes BATCH-Skript (im Link). Ein weiteres conist , dass Sie tatsächlich einen benutzerdefinierte Python - Skript für jede Version von Python schreiben müssen , die Sie testen wollen. Dies ist nicht dasselbe wie das OP der Verwendung der bevorzugten Python-Version des Skripts.
Jesse Chisholm
0

Sie können dies nicht innerhalb des Python-Programms tun, da die Shell entscheidet, welche Version verwendet werden soll, wenn Sie eine Shebang-Zeile verwenden.

Wenn Sie keine Shell mit einer Shebang-Linie verwenden und nur eingeben python myprogram.py, wird die Standardversion verwendet, es sei denn, Sie entscheiden speziell, welche Python-Version Sie verwenden, wenn Sie pythonXXX myprogram.pydie zu verwendende Version eingeben.

Sobald Ihr Python-Programm ausgeführt wird, haben Sie bereits entschieden, welche ausführbare Python-Datei zum Ausführen des Programms verwendet werden soll.

virtualenv dient zur Trennung von Python-Versionen und -Umgebungen und dient speziell zur Beseitigung von Konflikten.

Peter Mortensen
quelle
Wenn ich also Python 2.7.3 zum Ausführen eines Programms verwenden möchte, würde ich im Terminal schreiben: python 2.7.3 main.py?
Jesus
Auch zu virtualenv: Ja, aber wenn die virtualenv für alle Abhängigkeiten einer Python-Version eingerichtet ist und ich dann eine andere verwende, um das darin enthaltene Programm auszuführen, besteht dann nicht die Möglichkeit von Konflikten?
Jesus
In der Dokumentation finden virtualenvSie alle Details zu dem Problem, das es löst.
-2

Während Sie mit verschiedenen Versionen von Python unter Windows arbeiten,

Ich benutze diese Methode, um zwischen Versionen zu wechseln.

Ich denke, es ist besser, als sich mit Shebangs und Virtualenvs herumzuschlagen

1) Installieren Sie die gewünschten Python-Versionen

2) Gehen Sie zu Umgebungsvariablen> PFAD

(Ich gehe davon aus, dass Pfade von Python-Versionen bereits zu Env.Vars hinzugefügt wurden.> PATH)

3) Unterdrücken Sie die Pfade aller Python-Versionen, die Sie nicht verwenden möchten

(Löschen Sie die Pfade nicht, fügen Sie einfach ein Suffix wie "_sup" hinzu.)

4) Rufen Sie Python vom Terminal aus auf

(Windows überspringt also die falschen Pfade, die Sie geändert haben, und findet die Datei python.exe unter dem Pfad, den Sie nicht unterdrückt haben, und verwendet diese Version nach dem)

5) Wechseln Sie zwischen den Versionen, indem Sie mit Suffixen spielen

GMG
quelle
-2

Setzen Sie zu Beginn meiner Programme seine volle Nutzung für die Arbeit mit Python

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

Dieser Code hilft voll für den Fortschritt

Ashan Lakmal
quelle
-2

Ich hatte dieses Problem und habe gerade beschlossen, eines der Programme von python.exe in python2.7.exe umzubenennen. Jetzt kann ich an der Eingabeaufforderung angeben, welches Programm einfach ausgeführt werden soll, ohne Skripte einzuführen oder Umgebungspfade zu ändern. Ich habe also zwei Programme: Python2.7 und Python (letzteres ist v.3.8, auch bekannt als Standard).

Forrest Holub
quelle