Jaki jest właściwy sposób zarządzania wieloma wersjami Pythona?

21

Mam maszynę z zainstalowanym Pythonem 2.6 jako domyślnym Pythonem. Następnie zainstalowałem Python 2.7 i ręcznie utworzyłem / usr / bin / python jako dowiązanie symboliczne do nowej instalacji.

Potem miałem problemy z brakiem polecenia . Próbuję go ponownie zainstalować:

sudo apt-get remove command-not-found

i pojawia się ten błąd:

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

Ale naprawdę chcę, aby Python 2.7 był domyślny. Jak naprawić ten bałagan?

ripper234
źródło

Odpowiedzi:

16

Zmiana domyślnego Pythona (lub Perla itp.) W systemie operacyjnym to naprawdę zły pomysł. Ten interpreter jest właściwie częścią systemu operacyjnego i mogą istnieć inne komponenty systemu operacyjnego napisane specjalnie do pracy z tą wersją interpretera.

Na przykład w Redhat narzędziem yum, które wykonuje aktualizacje oprogramowania systemowego, jest aplikacja python. Naprawdę nie chcesz tego zepsuć. Takie aplikacje mogą zależeć od zainstalowania określonych, być może niestandardowych modułów Pythona, których zainstalowana wersja może nie mieć. Na przykład w Ubuntu uważam, że niektóre z wbudowanych narzędzi systemu operacyjnego napisanych w Pythonie używają ORM o nazwie Storm, który nie jest częścią standardowej biblioteki Pythona. Czy w Twojej czystej instalacji Python 2.7 zainstalowana jest konkretna oczekiwana wersja modułu Storm? Czy ma jakąś wersję Storm? Nie? Właśnie złamałeś część swojego systemu operacyjnego.

Właściwym sposobem na to jest zainstalowanie preferowanej wersji Pythona i skonfigurowanie konta użytkownika, aby z niego korzystać, konfigurując plik .bash_profile, ścieżkę itp. Możesz także zajrzeć do modułu virtualenv dla Pythona.

Simon Hibbs
źródło
1
Poszukałem tutaj Google. Zrobiłbym -1, gdybym miał rep na tym stosie. Dlaczego? Ponieważ sugerowane podejście mówi tylko „zainstaluj preferowaną wersję Pythona”. Jak to zrobić bez ukrywania systemowego pytona?
jez
@jez Użytkownicy powinni zapoznać się z instrukcją instalacji swojej aplikacji i wybranej kombinacji systemu operacyjnego. Ogólnie rzecz biorąc, pakiety instalatora będą instalowane w łagodnej lokalizacji, a nie nadpisują podstawowe komponenty systemu operacyjnego, więc nadpisanie wersji systemu byłoby szczególnym przypadkiem.
Simon Hibbs,
8

Jak naprawić ten bałagan?

Nic więcej niż ponowna instalacja python. Cofnie twoją zmianę (dowiązanie symboliczne).

Dlaczego chcesz to domyślnie? Za każdym razem, gdy jest to potrzebne, po prostu użyj python2.7lub #!/usr/bin/python2.7dołącz (shebang) na początku swoich (wykonywalnych) skryptów.

Jeśli nalegasz na to, aby mieć python2.7wartość domyślną dla całego systemu, użyj późniejszej wersji Ubuntu (obecnie jest to Ubuntu 11.04, o nazwie kodowej Natty). Używa tej wersji jako domyślnej.

W przyszłości unikaj ręcznych interwencji, takich jak to, co robiłeś z dowiązaniem symbolicznym. Jest to szczególnie prawdziwe w przypadku plików zarządzanych dystrybucyjnie, a szczególnie w przypadku złożonych bestii, takich jak instalacje w języku Python.

tshepang
źródło
Pomyślałem, że rozsądne jest zmienić domyślną instalację Pythona po aktualizacji. Chcę to domyślnie, ponieważ chcę pracować z nowszym pytonem ... jako domyślnie. Kiedy piszę pythonz bash, chcę uzyskać nowy python. Czy jest na to lepszy sposób niż to, co zrobiłem?
ripper234
Dla przypomnienia - nie sądzę, żeby coś było nie tak w sposobie instalacji Pythona 2.7. Jedynym „niekonwencjonalnym” posunięciem była zmiana dowiązania symbolicznego, co moim zdaniem było właściwym sposobem na ustawienie go jako domyślnego. Czy jest lepszy sposób?
ripper234
2
@ripper: Chyba przychodzę do tego wątku trochę za późno. Jak mówi Tshepang, pythonpakiet Ubuntu określa wersję systemu. Teraz można dostosować instalację, aby Python 2.7 był domyślny, tworząc własny pakiet Python itp., Ale jeśli tak, to skutecznie staniesz się opiekunem instalacji Python zamiast Ubuntu i będziesz musiał nauczyć się, jak Python jest zarządzany na Debian / Ubuntu. Należy pamiętać, że inne pakiety Pythona w systemie są skonfigurowane do domyślnej pracy z wersją 2.6, więc oprócz czegokolwiek innego może dojść do uszkodzenia.
Faheem Mitha
1
@Tshepang: Dobre podsumowanie!
Faheem Mitha
12
@ ripper234: Nie zmieniaj niczego /usr/bin, co jest zastrzeżone dla twojej dystrybucji. Zamiast tego utwórz /usr/local/bin/pythonsymboliczny link do python2.7. Następnie skrypty używające #!/usr/bin/env python(zalecanego idiomu), a także pisanie pythonw wierszu poleceń, uruchomią Python 2.7. Skrypty z dystrybucji, które chcą od Pythona dystrybucji, mogą nadal wywoływać #!/usr/bin/python.
Gilles „SO- przestań być zły”
2

Zastrzeżenie: Właśnie opublikowałem tę samą odpowiedź na przepełnienie stosu:

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

Oto moje podejście do problemu. Działa dla Python3. Główne cechy to:

  • Każda wersja Pythona jest kompilowana ze źródła
  • Wszystkie wersje są instalowane lokalnie
  • Nie zmienia w żaden sposób domyślnej instalacji Pythona w twoim systemie
  • Każda wersja Pythona jest izolowana za pomocą virtualenv

Kroki są następujące:

  1. Jeśli masz kilka dodatkowych wersji Pythona zainstalowanych w inny sposób, pozbądź się ich, np. Usuń $ HOME / .local / lib / python3.x itp. (Także te zainstalowane globalnie). Nie dotykaj jednak domyślnej wersji python3 systemu.

  2. Pobierz źródło dla różnych wersji Pythona w następującej strukturze katalogów:

    $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. W każdym katalogu „Python-3.xy /” wykonaj następujące czynności ( NIE używaj „sudo” w żadnym z kroków!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. W „python_versions /” utwórz pliki takie jak to:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Teraz, za każdym razem, gdy chcesz wybrać Python3.x, zrób

    source $HOME/python_versions/env_python3x.bash

    wejść do virtualenv

  6. Będąc w virtualenv, zainstaluj swoje ulubione pakiety Pythona za pomocą

    pip install --upgrade package_name
  7. Aby wyjść z wersji virtualenv i python, po prostu wpisz „dezaktywuj”

El Sampsa
źródło
0

Często umieszczamy wiele dystrybucji Pythona na Macu i Ubuntu i oto moja rekomendacja.

  1. Pozostaw python systemowy niezaprzeczalny: nigdy go nie używaj.

  2. Jeśli potrzebujesz tylko jednej podstawowej dystrybucji Pythona, pobierz i zainstaluj Canopy z enthought. Podczas instalacji wybierz „ustaw jako mój python systemowy”, a następnie możesz zainstalować pakiety z menedżera pakietów GUI Canopy.

    • Baldachim jest również kompatybilny od piprazu z poleceniem menedżera pakietów PyPi, które pozwala instalować pakiety (np. pip install python-twitter)
  3. Jeśli planujesz używać środowisk wirtualnych (tj. Tworzysz programy w języku Python i chcesz dla nich dedykowanego, czystego środowiska w języku Python, z łatwym sposobem przełączania się między nimi), poleciłbym Anacondę zamiast Canopy, ponieważ jest to narzędzie do zarządzania środowiskiem wirtualnym . To ci pozwoli
Adam Hughes
źródło
0

pyenv

https://github.com/pyenv/pyenv

Pyenv pozwala zarządzać wieloma wersjami Pythona bez sudo dla jednego użytkownika, podobnie jak Node.js NVM i Ruby RVM .

Zainstaluj Pyenv:

curl https://pyenv.run | bash

Następnie dodaj do .bashrc:

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

Znajdź wersję Python do zainstalowania:

pyenv install --list

Zainstaluj żądaną wersję Pythona:

# 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

Wyświetl dostępne wersje Pythona:

pyenv versions

Teraz mamy:

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

Wybierz inną wersję Pythona:

pyenv global 3.8.0
python --version
python3 --version

Oba wyjścia:

Python 3.8.0

Możemy teraz przystąpić do instalowania i używania pakietów normalnie:

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

Możemy potwierdzić, że wszystko jest zainstalowane lokalnie w naszym czystym środowisku dzięki:

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

Wykorzystanie według projektu

W poprzedniej sekcji widzieliśmy, jak używać pyenv w konfiguracji globalnej.

Jednak zwykle chcesz ustawić konkretny python i wersję pakietu dla poszczególnych projektów. Oto jak to zrobić.

Najpierw zainstaluj żądaną wersję Pythona jak poprzednio.

Następnie z poziomu katalogu projektu ustaw żądaną wersję Pythona za pomocą:

pyenv local 3.8.0

który tworzy plik .python-versionzawierający ciąg wersji.

A teraz zainstalujmy lokalnie pakiet tylko dla naszego projektu: TODO: nie ma dobrego sposobu na to: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Teraz, gdy ktoś chce użyć twojego projektu, zrobi:

pyenv local

co ustawia poprawną wersję Pythona.

Powiązane wątki:

Testowane na Ubuntu 18.04, pyenv 1.2.15.

Ciro Santilli
źródło