Jak używać pyenv do uruchamiania wielu wersji Pythona na Macu
Zarządzanie lokalnym środowiskiem programistycznym Pythona nadal stanowi wyzwanie, nawet dla doświadczonych programistów. Chociaż istnieją dobrze udokumentowane strategie zarządzania pakietami, istnieje inny krok niezbędny do zapewnienia, że używasz wersji Pythona, której potrzebujesz, kiedy jej potrzebujesz.
dlaczego wersja Pythona ma znaczenie?
na początku to dziwna koncepcja, ale języki programowania zmieniają się jak każde inne oprogramowanie. Mają błędy, poprawki i aktualizacje, jak każdy z ulubionych interfejsów API i każdego innego oprogramowania. Podobnie, różne wydania są identyfikowane za pomocą trzycyfrowego numeru znanego jako wersja semantyczna.
😭 😭 😭 pic.twitter.com/yt1Z2439W8
– Denny Perez (@dennyperez18) 28 maja 2019
przez wiele lat Python 2 był powszechnie używaną główną wersją języka programowania. W styczniu 2020 roku, Python 2 osiągnął koniec życia, a od tego czasu Tylko Python 3 będzie obsługiwany przez głównych opiekunów języka. Python 3 stale się rozwija i regularnie wydaje nowe aktualizacje. To sprawia, że ważne jest dla mnie, aby regularnie otrzymywać te aktualizacje.
Ostatnio próbowałem uruchomić projekt na macOS, który zależał od Pythona 3.5.9, wersji, której nie miałem zainstalowanego w moim systemie. Może wydawać się logiczne, że Menedżer pakietów Pythona pip może go zainstalować*, ale tak nie było:
$ pip install python3.5.9
Collecting python3.5.9
ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9
alternatywnie mogłem pobrać tę wersję z oficjalnej strony Pythona, ale jak uruchomić ją na moim Macu wraz z moją istniejącą wersją Pythona? Określanie wersji Pythona, której zamierzam używać przy każdym uruchomieniu interpretera (python3 .7 lub python3. 5 na przykład) wydaje się w najlepszym razie podatne na błędy. Musi być lepszy sposób.
(uwaga na powyższe: wiem, że to nie ma sensu dla doświadczonego programisty Pythona, ale miało to dla mnie wtedy sens. Chętnie bym opowiedział, dlaczego nadal uważam, że powinno.)
instalacja i konfiguracja pyenv
na szczęście pyenv istnieje, aby obejść tę serię zawiłości. Aby rozpocząć, musiałem zainstalować pyenv. Mógłbym sklonować i skompilować go samodzielnie ze źródła, ale wolę zarządzać takimi pakietami za pomocą menedżera pakietów Homebrew:
$ brew install pyenv
aby używać wersji Pythona poprzez pyenv, konieczne jest zrozumienie zmiennej PATH powłoki. Ścieżka określa, gdzie powłoka wyszukuje pliki według nazwy polecenia. Musisz upewnić się, że powłoka znajdzie wersję Pythona uruchomioną przez pyenv, a nie zainstalowaną domyślnie (często nazywaną wersją systemową). Jeśli nie zmienisz ścieżki, oto wynik:
$ which python
/usr/bin/python
To jest systemowa wersja Pythona.
aby poprawnie skonfigurować pyenv, możesz uruchomić następujące czynności w Bash lub zsh:
$ PATH=$(pyenv root)/shims:$PATH
teraz, jeśli sprawdzisz wersję Pythona, zobaczysz, że jest ona zarządzana przez pyenv:
$ which python
/Users/my_username/.pyenv/shims/python
Ta instrukcja eksportu (PATH=) zmieni się tylko dla tej instancji powłoki, więc zmień ją na stałą, musisz dodać ją do swoich plików dotfiles. Ponieważ zsh jest oficjalnie domyślną powłoką macOS, skupię się na niej. Dołącz tę samą składnię do~/.plik zshrc:
$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
teraz za każdym razem, gdy uruchamiamy polecenie zsh, będzie ono używać wersji Pythona pyenv. Zauważ, że użyłem pojedynczych cudzysłowów z echo, więc nie ocenia i nie rozwija poleceń.
plik zshrc zarządza tylko instancjami zsh, więc sprawdź, czym jest twoja powłoka i edytuj powiązane pliki dotfiles. Jeśli chcesz dwukrotnie sprawdzić, jaka jest domyślna powłoka, możesz uruchomić echo $SHELL. Jeśli to zsh, użyj polecenia powyżej. Jeśli używasz Basha, Zmień ~/.zshrc do ~/.bashrc. Możesz zagłębić się w ustawienia ścieżki w README pyenva, jeśli chcesz dowiedzieć się więcej.
używanie pyenv do zarządzania wersjami Pythona
teraz, gdy pyenv ma kontrolę, widzimy, że ma tylko systemowy Python:
$ pyenv versions
system
jak wspomniano powyżej, absolutnie nie chcesz używać tej wersji (przeczytaj więcej o tym, dlaczego). Teraz, gdy pyenv jest poprawnie skonfigurowany, chcę, aby miał kilka różnych wersji Pythona, których regularnie używam.
istnieje sposób, aby zobaczyć wszystkie wersje Pythona dostępne z różnych repozytoriów, do których pyenv ma dostęp, uruchamiając pyenv install –list. Jest to długa, przytłaczająca lista, która może być pomocna w przejrzeniu w przyszłości. Na razie pozostaję przy najnowszych wydaniach (3.5.x lub 3.6.x gdzie X jest najnowszym) znalezionym na stronie pobierania Pythona. Mając to na uwadze, zainstaluję 3.5.9 i 3.8.0:
$ pyenv install 3.5.9
$ pyenv install 3.8.0
to trochę potrwa, więc weź herbatę (lub przeczytaj jeden z linków powyżej). Warto zauważyć, że dane wyjściowe przechodzą przez pobieranie i budowanie tej wersji Pythona. Na przykład, wynik pokazuje, że plik pochodzi bezpośrednio z Python.org.
gdy wszystko zostanie zainstalowane, możesz skonfigurować swoje domyślne ustawienia. Lubię żyć na krawędzi, więc ustawiłem moją globalną domyślną wersję Pythona na najnowszą:
$ pyenv global 3.8.0
I Ta wersja jest natychmiast ustawiona w mojej powłoce. Aby potwierdzić:
$ python -V
Python 3.8.0
projekt, który chcę uruchomić, działa tylko z Pythonem 3.5, więc ustawię wersję lokalnie i potwierdzę, że jest w użyciu:
$ pyenv local 3.5.9
$ python -V
Python 3.5.9
ponieważ użyłem opcji lokalnej z pyenv, dodałem plik do mojego bieżącego katalogu, aby śledzić te informacje.
$ cat .python-version
3.5.9
teraz mogę w końcu skonfigurować wirtualne środowisko dla projektu, który chcę i mieć pewność, że używam odpowiedniej wersji Pythona.
$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
aby dowiedzieć się więcej, zapoznaj się z tym samouczkiem na temat zarządzania środowiskami wirtualnymi na komputerze Mac.
zakończenie
domyślnie uruchamianie wielu wersji Pythona może być wyzwaniem. Uważam, że zaczynając od pyenv zapewnia, że mam wersje Pythona, które muszę skonfigurować, aby działały, gdy ich potrzebuję.