Środowisko wirtualne w Python

środowisko wirtualne python virtual env venv

– Tato, co robisz?

– Pssssssst. Cichutko Księżniczko, daj mi chwilkę, bo jeszcze pracuję. Tworzę środowisko dla nowego projektu.

– Nie rozumiem tatusiu. Że co robisz?

– Hmm… To tak jakbym chciał się pobawić w nową zabawę. Szykuję w tym celu specjalny pokój, w którym będę mógł się bawić i niczego nie zepsuję przypadkiem.

Jakiś rok temu zacząłem częściej wykorzystywać środowiska wirtualne w Python. Stworzenie nowego środowiska dla każdego realizowanego projektu bardzo ułatwia mi pracę. Zawsze pilnuję, aby było ono kompatybilne z konkretnym rozwiązaniem.

Po co mi to środowisko wirtualne?

Wyobraź sobie prostą sytuację. Masz projekt, w którym zbudowałeś prostą sieć neuronową w tensorflow, powiedzmy w wersji 2.1. i co tydzień musisz wykonać predykcję. W międzyczasie masz przygotować nowy model, który wygeneruje wiersze. Dla niego potrzebujesz tensorflow w wersji 1.15. Pracując na jednym bazowym środowisku to niemożliwe, aby mieć obie wersje pakietów.

Wówczas na pomoc przychodzi właśnie środowisko wirtualne.

Co to jest środowisko wirtualne?

Środowisko wirtualne (zwane również jako virtualenv lub venv) jest niczym innym jak oddzielnym, dedykowanym środowiskiem (inna instancja Pythona), na której można pracować.

Innymi słowy, jest to sposób na uruchomienie na naszej maszynie dedykowanego miejsca, by zainstalować tylko potrzebne pakiety. Dzięki posiadaniu oddzielnych środowisk dopasowanych do potrzeb Twoich projektów nie będziesz musiał zaśmiecać głównej instancji wszystkimi niezbędnymi pakietami. Dzięki temu będziesz miał kontrolę nad wersjami pakietów i unikniesz chaosu.

Wystarczy przypilnować, aby każdy projekt miał własne środowisko wykorzystując w tym celu Anakondę!

Czym jest Anaconda?

Anaconda to darmowy program zbierający moim zdaniem jeden z najlepszych zestawów narzędzi do analizy danych. Zawiera zarówno język Python jak i R. Umożliwia pracę z tysiącami pakietów i bibliotek typu open source. Jest rozwijany i utrzymywany przez firmę Anaconda, Inc. i posiada ponad 20 milionów użytkowników na całym świecie!

Po zainstalowaniu możemy korzystać w linii poleceń z potężnych właściwości, które daje nam conda.

Jak stworzyć środowisko w Anaconda?

Jak już wspomniałem obecnie tworzę osobne środowisko per każdy większy projekt. Dzięki temu i pracy z GITem jesteśmy w zespole pewni, że wszystkie osoby w teamie działają na tych samych wersjach pakietów i nic nie powinno nas zaskoczyć. Szczególnie jak ktoś pisze: „U mnie działa” a u innych nie :). 

Zobacz, jak można prosto stworzyć własne środowisko wirtualne, zainstalować pakiety, a następnie je w całości usunąć!

Lista środowisk wirtualnych

Aby sprawdzić jakie masz aktualnie środowiska wystarczy wpisać w komendzie:

conda env list
środowisko wirtualne python anaconda conda env list

Gwiazdką (*) mamy zaznaczone aktualnie aktywne środowiska w AnacondaPromp. Nasze główne środowisko nazywa się base, a wszystkie pozostałe są tymi, które do tej pory stworzyliśmy.

Tworzenie środowiska wirtualnego

Aby utworzyć środowisko wystarczy wpisać:

conda create --name test python=3.8

Warto zwrócić uwagę na wersję Pythona. Różne pakiety mogą działać różnie w zależności od wersji. Niedawno w pracy stworzyłem nowe środowisko i chciałem zainstalować najnowszego Tensorflow i miałem dość sporo problemów. Znalazłem w internecie informację, że rozwiązaniem byłoby przeinstalowanie VisualStudio C++. Niestety, nie mając uprawnień administratora (względy bezpieczeństwa w banku), zrobienie tego zajęłoby pewnie kilka dni (musiałbym się zgłosić z tym tematem do naszego IT). Więc stworzyłem ostatecznie środowisko wirtualne na wersji 3.7 i wszystko było ok🙂

Zatem stwórzmy środowisko pod blogowy projekt związany z wykresami w pythonie na wersji 3.7:

conda create --name BlogCharts python=3.7
środowisko wirtualne python anaconda conda create

Jeszcze potwierdzenie tego, co zostanie zainstalowane:

środowisko wirtualne python anaconda conda create agree

 I możemy się cieszyć naszym nowym środowiskiem wirtualnym!

Sprawdźmy jeszcze raz komendą conda env list, czy widać nasze nowe środowisko wirtualne.

środowisko wirtualne python anaconda conda env list
Instalacja pakietów Python

Teraz w pierwszej kolejności aktywujmy środowisko wirtualne

conda activate BlogCharts
środowisko wirtualne python anaconda conda activate

i możemy operować na nim jak na głównym.

Można sprawdzić jeszcze, jakie mamy pakiety:

conda list
środowisko wirtualne python anaconda conda list

Możesz teraz zainstalować najnowszy pakiet korzystając z komendy:

pip install pandas
python pip install

albo z konkretną wersją (jeśli już miałeś ten pakiet to zostanie przeinstalowany na konkretną wersję):

pip install pandas==0.24.1
python pip install pandas specific version specyficzna wersja

Dobra, przywróćmy najnowszą wersję na dziś (tj. 2021.02.12)

pip install --upgrade pandas
python pip install pandas

Jak widzisz została odinstalowana wcześniejsza wersja i zainstalowana najnowsza.

A jak masz plik requiments.txt możesz od razu zainstalować wszystkie:

pip install -r requirements.txt
pip install -r requirements.txt

Przypomnę tylko, że należy podać pełną ścieżkę do pliku, albo być w konsoli w folderze z tym plikiem.

Jupyter Notebook

Dobra, ale czy da radę odpalić to środowisko w Jupyter Notebook’u? Żaden problem! Wystarczy na naszym utworzonym środowisku zrobić jeszcze dwie rzeczy.

Po pierwsze należy zainstalować bibliotekę ipykernel:

pip install ipykernel
pip install ipykernel

a po drugie trzeba jeszcze dodać nasze środowisko wirtualne z odpowiednią nazwą:

python -m ipykernel install --user --name BlogCharts --display-name "BlogCharts"
python -m ipykernel install --user --name BlogCharts --display-name "BlogCharts"

I już można z niego korzystać wybierając nowy plik z odpowiednim kernelem:

jupyter notebook add virtual env dodanie wirtualnego środowistka

lub zmieniając kernel już w otwartym notebooku:

jupyter notebook add virtual env dodanie wirtualnego środowistka
Usuwanie

Jeśli już nie używasz środowiska, to warto po sobie posprzątać :). Możesz to zrobić wykorzystując polecenie:

conda remove --name myenv --all
conda remove --name myenv --all

Musisz jeszcze potwierdzić:

conda remove --name myenv --all

I mamy posprzątane w Anakondzie.

Pamiętaj jeszcze, by posprzątać także w Notebook Jupyterze, jeśli go używałeś. Tak możesz sprawdzić jakie masz zdefiniowane środowiska wirtualne:

jupyter kernelspec list
jupyter kernelspec list

A tak możesz usunąć już niedostępne:

jupyter kernelspec remove <kernel_name>

Dokumentacja

W razie wątpliwości zachęcam to zapoznania się z dokumentacją: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html 

Możesz także skorzystać z CheatSheet’a:

Potęga YAML’a, czyli jak w jednej linii kodu postawić całe środowisko

Jeśli nie chcesz tworzyć środowiska z wiersza poleceń z jakichś powodów, możesz utworzyć plik YAML (YAML Ain’t Markup Language), który działa jak plik konfiguracyjny. Twój plik YAML może wyglądać mniej więcej tak:

python przykład yaml

Gdyby ten plik miał nazwę „BlogCharts.yml” (TUTAJ plik do tego, który stworzyłem), mógłbyś utworzyć środowisko wirtualne za pomocą poniższego polecenia:

conda env create -f BlogCharts.yml

Flaga „-f” oznacza plik, natomiast nazwa pliku YAML powinna być zaraz po fladze „-f”.

Super sprawa, że w tak prosty sposób można utworzyć plik YAML zawierający wszystkie pakiety i konfigurację środowiska. Aby teraz odtworzyć to środowisko wirtualne na innym komputerze lub serwerze i uzyskać dokładnie taką samą konfigurację wystarczy napisać komendę:

conda env export > BlogCharts.yml
python przykład yaml

Symbol większe niż „>” oznacza, że dane wyjściowe są zapisywane do pliku o nazwie „BlogCharts.yml”. Pamiętaj, że jeśli byłaby jakaś zawartość w „BlogCharts.yml” to przed tym poleceniem zostałaby ona nadpisana.

Proste te YAMLe, co nie? 🙂

Mam nadzieję, że środowiska wirtualne sprawią, że łatwiej będzie Ci pracować nad projektami w języku Python. 

Pozdrawiam z całego serducha,

podpis Mirek

Image by Waqutiar Rahaman from Pixabay

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *