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
- Najpierw zaloguj się do SSH na swoim serwerze VPS jako zwykły użytkownik,
- Wymagany jest
git
w systemie. Na hostingu dedykowanym VPS
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 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"
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
.
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.