Was ist der richtige Weg, um mehrere Python-Versionen zu verwalten?

21

Ich habe einen Computer mit Python 2.6 als Standard-Python installiert. Dann habe ich Python 2.7 installiert und / usr / bin / python manuell als Symlink zur neuen Installation erstellt.

Dann stieß ich auf Probleme mit nicht gefundenen Befehlen . Ich versuche es neu zu installieren:

sudo apt-get remove command-not-found

und ich bekomme diesen Fehler:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Aber ich möchte wirklich, dass Python 2.7 der Standard ist. Wie behebe ich dieses Durcheinander?

ripper234
quelle

Antworten:

16

Das Ändern des Standard-Pythons (oder von Perl usw.) unter einem Betriebssystem ist wirklich eine schlechte Idee. Dieser Interpreter ist tatsächlich Teil des Betriebssystems, und es kann durchaus andere Betriebssystemkomponenten geben, die speziell für diese Version des Interpreters geschrieben wurden.

Bei Redhat ist das yum-Tool, das Systemsoftware-Updates ausführt, beispielsweise eine Python-Anwendung. Du willst das wirklich nicht brechen. Solche Anwendungen können von bestimmten, möglicherweise nicht standardmäßigen Python-Modulen abhängen, die in der von Ihnen installierten Version möglicherweise nicht installiert sind. Ich glaube zum Beispiel, dass einige der in Python integrierten OS-Tools ein ORM namens Storm verwenden, das nicht Teil der Python-Standardbibliothek ist. Hat Ihre saubere Python 2.7-Installation die spezifische erwartete Version des Storm-Moduls installiert? Hat es eine Version von Storm? Nein? Dann haben Sie gerade einen Teil Ihres Betriebssystems zerstört.

Der richtige Weg, dies zu tun, ist, Ihre bevorzugte Version von Python zu installieren und Ihr Benutzerkonto einzurichten, um es zu verwenden, indem Sie Ihr .bash_profile, Ihren Pfad und dergleichen einrichten. Vielleicht möchten Sie auch das virtualenv-Modul für Python untersuchen.

Simon Hibbs
quelle
1
Ich habe hier gegoogelt. Wäre -1, wenn ich den Repräsentanten auf diesem Stapel hätte. Warum? Denn der vorgeschlagene Ansatz besagt nur "Installiere deine bevorzugte Version von Python". Wie geht das, ohne das System Python zu verschließen?
jez
@jez Benutzer sollten die Installationsanweisungen für die von ihnen gewählte Kombination aus Anwendung und Betriebssystem beachten. Im Allgemeinen werden Sprachinstallationspakete an einem sicheren Ort installiert, wobei die Kernbetriebssystemkomponenten nicht überschrieben werden. Daher ist das Überschreiben der Betriebssystemversion der Sonderfall.
Simon Hibbs
8

Wie behebe ich dieses Durcheinander?

Nichts weiter als eine Neuinstallation python. Dadurch wird Ihre Änderung rückgängig gemacht (der Symlink).

Warum möchten Sie es als Standard? Jedes Mal, wenn Sie es benötigen, verwenden Sie einfach (den shebang) am Anfang Ihrer (ausführbaren) Skripte python2.7oder #!/usr/bin/python2.7fügen Sie ihn ein .

Wenn Sie darauf bestehen, python2.7systemweite Standardeinstellungen zu verwenden, verwenden Sie eine spätere Version von Ubuntu (derzeit Ubuntu 11.04 mit dem Codenamen Natty). Diese Version wird standardmäßig verwendet.

Vermeiden Sie in Zukunft manuelle Eingriffe wie das, was Sie mit der Symlink-Sache gemacht haben. Dies gilt insbesondere für Dateien mit Distributionsverwaltung und insbesondere für komplexe Objekte wie Python-Installationen.

Tshepang
quelle
Ich dachte, dass es nur sinnvoll ist, die Standard-Python-Installation nach dem Upgrade zu ändern. Ich möchte es als Standard, weil ich mit dem neueren Python arbeiten möchte ... als Standard. Wenn ich pythonvon Bash schreibe, möchte ich die neue Python bekommen. Gibt es einen besseren Weg, dies zu tun als das, was ich getan habe?
Ripper234
Nur zur Erinnerung - ich glaube nicht, dass irgendetwas an der Art und Weise, wie ich Python 2.7 installiert habe, falsch war. Der einzige "unorthodoxe" Schritt war, den Symlink zu ändern, was meiner Meinung nach der richtige Weg war , ihn als Standard festzulegen. Gibt es einen besseren Weg?
Ripper234
2
@ripper: Ich schätze, ich komme etwas spät zu diesem Thread. Wie Tshepang sagt, bestimmt das pythonPaket auf Ubuntu die Systemversion. Sie können Ihre Installation jetzt so anpassen, dass Python 2.7 standardmäßig verwendet wird, indem Sie ein eigenes Python-Paket usw. erstellen. In diesem Fall behalten Sie jedoch Ihre Python-Installation anstelle von Ubuntu bei und müssen erst lernen, wie Python funktioniert wird unter Debian / Ubuntu verwaltet. Bedenken Sie, dass die anderen Python-Pakete im System so konfiguriert sind, dass sie standardmäßig mit 2.6 funktionieren.
Faheem Mitha
1
@ Tshepang: Gute Zusammenfassung!
Faheem Mitha
12
@ ripper234: Ändere nichts in /usr/bin, das ist für deine Distribution reserviert. Stellen Sie stattdessen /usr/local/bin/pythoneinen symbolischen Link zu her python2.7. Dann führen Skripte mit #!/usr/bin/env python(der empfohlenen Sprache) sowie die Eingabe pythonin der Befehlszeile Python 2.7 aus. Skripte aus der Distribution, die Python aus der Distribution erhalten möchten, können weiterhin Anrufe tätigen #!/usr/bin/python.
Gilles 'SO - hör auf böse zu sein'
2

Haftungsausschluss: Ich habe gerade die gleiche Antwort für den Stapelüberlauf gepostet:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Hier ist meine Sicht auf das Problem. Funktioniert für Python3. Die Hauptmerkmale sind:

  • Jede Python-Version wird aus dem Quellcode kompiliert
  • Alle Versionen werden lokal installiert
  • Beeinträchtigt in keiner Weise die Standard-Python-Installation Ihres Systems
  • Jede Python-Version ist mit virtualenv isoliert

Die Schritte sind wie folgt:

  1. Wenn Sie mehrere zusätzliche Python-Versionen auf andere Weise installiert haben, entfernen Sie diese, z. B. $ HOME / .local / lib / python3.x usw. (auch die global installierten). Berühren Sie jedoch nicht die Standard-Python3-Version Ihres Systems.

  2. Download-Quelle für verschiedene Python-Versionen unter der folgenden Verzeichnisstruktur:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. Bei jedem „Python-3.xy /“ Verzeichnis, gehen Sie wie folgt (bitte NICHT verwenden „sudo“ in einem der Schritte!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. Erstellen Sie unter "python_versions /" folgende Dateien:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Nun, wann immer Sie sich für python3.x entscheiden möchten, tun Sie dies

    source $HOME/python_versions/env_python3x.bash

    um die virtuelle Umgebung aufzurufen

  6. Installieren Sie in der virtuellen Umgebung Ihre bevorzugten Python-Pakete mit

    pip install --upgrade package_name
  7. Um die Virtualenv- und Python-Version zu beenden, geben Sie einfach "disable" ein.

El Sampsa
quelle
0

Wir haben viele Python-Distributionen auf Mac und Ubuntu installiert und hier meine Empfehlung.

  1. Lassen Sie das System Python unbeschadet: Verwenden Sie es nie.

  2. Wenn Sie nur eine primäre Python-Distribution benötigen, laden Sie Canopy von enthought herunter und installieren Sie es. Wenn es installiert wird, wählen Sie "Als mein System-Python festlegen" und dann können Sie Pakete von Canopys GUI-Paket-Manager installieren.

    • Canopy ist auch sofort einsatzbereit mit pipdem PyPi-Paketmanager-Befehl, mit dem Sie Pakete installieren können (z. B. pip install python-twitter).
  3. Wenn Sie vorhaben, virtuelle Umgebungen zu verwenden (dh Sie entwickeln Python-Programme und möchten für jede eine eigene, saubere Python-Umgebung, zwischen denen Sie auf einfache Weise wechseln können), empfehle ich Anaconda anstelle von Canopy, da es sich um ein Virtual Environment Manager-Tool handelt . Das wirst du lassen
Adam Hughes
quelle
0

pyenv

https://github.com/pyenv/pyenv

Mit Pyenv können Sie mehrere Python-Versionen ohne sudo für einen einzelnen Benutzer verwalten, ähnlich wie mit Node.js NVM und Ruby RVM .

Installieren Sie Pyenv:

curl https://pyenv.run | bash

Dann ergänzen Sie Ihre .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Finden Sie die zu installierende Python-Version:

pyenv install --list

Installieren Sie die gewünschte Python-Version:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Liste der verfügbaren Python-Versionen:

pyenv versions

Wir haben nun:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Wählen Sie eine andere Python-Version:

pyenv global 3.8.0
python --version
python3 --version

Beide Ausgaben:

Python 3.8.0

Wir können nun fortfahren, Pakete normal zu installieren und zu verwenden:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Wir können bestätigen, dass alles lokal in unserer sauberen Umgebung installiert ist mit:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Pro Projektverwendung

Im vorherigen Abschnitt haben wir gesehen, wie pyenv in einem globalen Setup verwendet wird.

Normalerweise möchten Sie jedoch eine bestimmte Python- und Paketversion pro Projekt festlegen. So geht's.

Installieren Sie zunächst Ihre gewünschte Python-Version wie zuvor.

Stellen Sie dann in Ihrem Projektverzeichnis die gewünschte Python-Version ein mit:

pyenv local 3.8.0

Dadurch wird eine Datei erstellt, .python-versiondie die Versionszeichenfolge enthält.

Und nun lassen Sie sich ein Paket lokal nur für unser Projekt zu installieren: TODO: Es gibt keine nette Art , wie es scheint: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Wenn jemand Ihr Projekt verwenden möchte, führt er Folgendes aus:

pyenv local

Dadurch wird die Python-Version auf die richtige eingestellt.

Verwandte Themen:

Getestet unter Ubuntu 18.04, pyenv 1.2.15.

Ciro Santilli ist ein Schauspieler
quelle