Przejdź do głównej zawartości

Instalacja i zarządzanie python za pomocą pyenv (hosting VPS)

Potrzebujesz różnych wersji python w swoim systemie? Pracujesz nad kilkoma projektami jednocześnie? A może chcesz odpalić starą aplikację, która nie ruszy na domyślnym interpreterze? Zamiast kombinować z dockerem albo wirtualkami — zainstaluj pyenv. To prostsze niż myślisz i daje pełną kontrolę nad środowiskiem programistycznym.

Co to jest pyenv?

pyenv to narzędzie, które pozwala na zarządzanie wieloma wersjami Pythona. Dzięki niemu zainstalujesz jednocześnie wiele różnych wersji i będziesz mógł się między nimi przełączać bez konfliktów. Przydaje się, gdy:

  • pracujesz z projektami wymagającymi różnych wersji Pythona,
  • testujesz paczki lub skrypty w różnych środowiskach,
  • masz DirectAdmin albo inne środowisko hostingowe, gdzie systemowy Python nie powinien być modyfikowany

Instalacja pyenv na serwerze

Wydaj polecenie:

cd ~
curl https://pyenv.run | bash

Ten skrypt sklonuje pyenv do ~/.pyenv i dorzuci pluginy pyenv-virtualenv, pyenv-update, pyenv-doctor, pyenv-installer.

instalacja pyenv skrypt Instalacja pyenv za pomocą skryptu

(1) Po instalacji koniecznie koniecznie dorzuć te linijki do pliku .bashrc:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"
eval "$(pyenv virtualenv-init -)"

Teraz przeładuj profil poleceniem

source ~/.bashrc

Na ten moment, pyenv zainstalował się prawidłowo, na naszym koncie działa tylko systemowy python 3.9.21, pora coś doinstalować .

adam@serwer[~]$ pyenv --version
pyenv 2.6.11
adam@serwer[~]$ command -v python3
/usr/bin/python3
adam@serwer[~]$ /usr/bin/python3 --version
Python 3.9.21
adam@serwer[~]$
adam@serwer[~]$ pyenv version
system (set by /home/adam/.pyenv/version)

Instalacja dodatkowej wersji python

Zobaczmy jakie wersje możemy zainstalować, lista będzie długa dlatego można sobie wyfiltrować

pyenv install --list

lub

pyenv install --list | grep "  3.10"

wersje python z pyenv Lista wersji python możliwych do zainstalowania.

Dla testów instalujemy wersję 3.10.19

pyenv install 3.10.19

Wynik:

adam@serwer[~]$ pyenv install 3.10.19
Downloading Python-3.10.19.tar.xz...
-> https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tar.xz
Installing Python-3.10.19...
Installed Python-3.10.19 to /home/adam/.pyenv/versions/3.10.19
adam@serwer[~]$

Zmiana wersji python za pomocą pyenv

Istnieją dwie metody ustawiania wersji python #1: peynv global i #2: pyenv local

pyenv global 3.10.19
  • Ustawia domyślną wersję Pythona dla całego użytkownika.
  • Dotyczy wszystkich katalogów, które nie mają lokalnej wersji (local) ustawionej.
  • Wartość zapisana jest w pliku: ~/.pyenv/version możesz go podejrzeć

To najbezpieczniejsze ustawienie, jeśli:

  • nie chcesz używać systemowego Pythona,
  • chcesz mieć zawsze konkretną wersję,
  • pracujesz na serwerze/środowisku developerskim bez virtualenv.

Z kolei pyenv local

pyenv local 3.10.19
  • Ustawia wersję Pythona tylko w jednym katalogu roboczym (np. dla konkretnego projektu).
  • Tworzy plik .python-version w danym katalogu.
  • Działa też rekurencyjnie - jeśli wejdziesz do podkatalogu, pyenv odziedziczy tę wersję.
  • To świetne rozwiązanie dla projektów, które potrzebują specyficznej wersji - np. starszej lub eksperymentalnej.

Poprzełączajmy sobie teraz wersje globalne i lokalne w katalogach i zobaczmy czy działa:

adam@serwer[~]$ pyenv versions
* system (set by /home/adam/.pyenv/version)
3.10.13
3.10.19
adam@serwer[~]$ pyenv global 3.10.19
adam@serwer[~]$ pyenv versions
system
3.10.13
* 3.10.19 (set by /home/adam/.pyenv/version)
adam@serwer[~]$ python3 --version
Python 3.10.19
adam@serwer[~]$ cd py-project1/
adam@serwer[py-project1]$ pyenv local 3.10.13
adam@serwer[py-project1]$ python3 --version
Python 3.10.13
adam@serwer[py-project1]$ pyenv versions
system
* 3.10.13 (set by /home/adam/py-project1/.python-version)
3.10.19

Wszystko ok, globalna użytkownika ustawiona na 3.10.19 a w folderze py-project/ działa 3.10.13.

Tymczasowe uruchamianie konkretnej wersji Pythona

Czasem nie chcesz zmienić globalnej ani lokalnej wersji python, ale potrzebujesz odpalić coś szybko w konkretnej wersji interpretera. Możesz to zrobić w terminalu, używając zmiennej środowiskowej PYENV_VERSION przy uruchamianiu

PYENV_VERSION=3.11.8 python3 script.py

Usuwanie konkretnej wersji pythona z pyenv

Jeśli zechcesz usunąć którąś wersje pythona, możesz wykonać to poleceniem pyenv uninstall {wersja}

Załóżmy że mamy zainstalowane dwie wersje 3.10.13 i 3.10.19, to "co" masz zainstalowane możesz sprawdzić poleceniem

pyenv versions

Wynik:

adam@serwer[~]$ pyenv versions
system
3.10.13
* 3.10.19 (set by /home/adam/.python-version)
adam@serwer[~]$

Usunięcie wersji 3.10.13:

pyenv uninstall 3.10.13

Wynik:

adam@serwer[~]$ pyenv uninstall 3.10.13
pyenv: remove /home/adam/.pyenv/versions/3.10.13? (y/N) y
pyenv: 3.10.13 uninstalled
adam@serwer[~]$

Czyści miejsce w ~/.pyenv/versions.

informacja

W folderze ~/.pyenv/versions znajdują się wszystkie dodatkowo zainstalowane przez pyenv wersje python .

Podczas instalacji python brakuje pakietów

Może się zdarzyć że podczas instalacji kolejnej wersji python może brakować niektórych bibliotek pakietów i otrzymasz informacje typu:

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/adam/.pyenv/versions/3.10.13/lib/python3.10/curses/__init__.py", line 13, in <module>
from _curses import *
ModuleNotFoundError: No module named '_curses'
WARNING: The Python curses extension was not compiled. Missing the ncurses lib?
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'readline'
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?

To nie jest nic krytycznego, nowa wersja python będzie dalej działała, z tymże nie będzie obsługiwała tych brakujących bibliotek. Jeśli zależy Ci na bibliotekach, których akurat brakuje - poproś administratora serwera o doinstalowanie.

pyenv to narzędzie, które rozwiązuje podstawowe problemy wersji. Szczególnie, gdy musisz utrzymać starszy kod albo unikasz grzebania w systemowym Pythonie na serwerze z DirectAdmin. Jeśli masz git i bazowe pakiety — reszta to tylko kilka komend.