Standardmäßig python3 für '/ usr / bin / env python'

13

Ich habe python2.7 und pyhton3.5 mit apt-get installiert.
In meiner .bashrc muss ich alias python=python3python3 als Standard festlegen. Dies funktioniert, wenn ich Python nur direkt ausführe, aber es scheint nicht mit / usr / bin / env zu funktionieren.

Wie kann ich in diesem Fall python3 erzwingen?

$ python --version
Python 3.5.2
$ /usr/bin/env python --version
Python 2.7.12
r03
quelle
Sie können python3stattdessen Python eingeben, also können Sie im Skript #!/usr/bin/env python3
Benny
1
Ja, aber ich verwende Skripte, die nicht von mir erstellt wurden. Ich ziehe es vor, sie nicht zu ändern.
r03
4
Python2 und Python3 sind nicht kompatibel. Diese Skripte erwarten wahrscheinlich Python 2
Hack Saw

Antworten:

14

Das envliegt daran, dass Sie pythonin Ihrer PATH, nicht in einer eingebauten Shell, einem Alias ​​oder einer Funktion suchen . Wie Sie festgelegt haben , pythonwie python3als Alias, envwird es nicht finden, wird es die Suche durch PATHund lösen pythonzu /usr/bin/python(das ist python2).

Sie können alle verfügbaren Speicherorte der ausführbaren Datei pythonin bash: do überprüfen :

type -a python

Sie haben kein Glück, wenn Sie einen Alias ​​in Shebang verwenden möchten, da Shebang per Definition ein vollständiger Pfad zur ausführbaren Interpreter-Datei sein muss, den Sie bei der Verwendung envauflösen sollten . Um das Skript mit dem Shebang zu interpretieren :python/usr/bin/env pythonpython3

#!/usr/bin/env python3
heemayl
quelle
2
Vielen Dank. Ich habe es vorerst so gemacht: 'ln -s / usr / bin / python3 ~ / bin / python'. ~ / bin steht zuerst im PFAD.
r03
2
@ r03 Tu das nicht, schau virtualenvstattdessen zu.
Heemayl
2

Angesichts der Anzahl der Skripte, die / usr / bin / env Python aufrufen und Python 2 erwarten, ist es wahrscheinlich eine schlechte Idee, Python tatsächlich Python 3 zu sein.

Wie Benny in einem Kommentar sagte, /usr/bin/env python3ist die richtige Lösung.

Hack Saw
quelle
Dies ist nicht mehr wahr
Neil G
1

Ich habe eine bessere Lösung gefunden als die hier veröffentlichten: http://redsymbol.net/articles/env-and-python-scripts-version/

Die Grundidee besteht darin, einen Symlink-Namen python zu python3 in ein anderes intelligent benanntes Verzeichnis zu setzen und dieses Verzeichnis dann am Anfang von $ PATH zu platzieren, damit es vor dem Verzeichnis unter / usr / bin gefunden wird.

Damit:

mkdir ~/bin/env_python3/
ln -s /usr/bin/python3 ~/bin/env_python3/python
$PATH = ~/bin/env_python3/:$PATH ./script.py

Mit dieser Lösung verknüpfen Sie / usr / bin / python nicht mit python3 und unterbrechen Skripte, bei denen davon ausgegangen wird, dass es sich um Python 2 handelt. Außerdem müssen Sie das Skript, das Sie von einer anderen Person heruntergeladen haben, nicht bearbeiten.

Meelash
quelle
1

Ohne das gesamte System zu stören, besteht meiner Meinung nach der beste Ansatz darin, eine virtuelle Umgebung in Ihrem Nutzungskonto zu erstellen und diese zu aktivieren

/ path / to / your / python3 -m pip create ~ / .venv

Quelle ~ / .venv / bin / aktivieren

Dann ist Ihre Standardpython diejenige, die Sie zum Erstellen der Vence verwendet haben (im Pfad usw.)

Mit dieser Lösung stören Sie das System auch nicht, wenn Sie neue Bibliotheken installieren, und benötigen keinen Root-Zugriff.

Andere Lösungen können die Stabilität Ihres Betriebssystems beeinträchtigen

Michael Hooreman
quelle