– 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órym można pracować.
Innymi słowy, jest to sposób na uruchomienie na naszej maszynie dedykowanego miejsca, aby 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 mieć 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 w całości je usunąć!

Lista środowisk wirtualnych
Aby sprawdzić jakie masz aktualnie środowiska wystarczy wpisać w komendzie:
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 Python na wersji 3.7:
conda create --name BlogCharts python=3.7
Jeszcze potwierdzenie tego, co zostanie zainstalowane:
I możemy się cieszyć naszym nowym środowiskiem wirtualnym!
Sprawdźmy jeszcze raz komendą conda env list, czy widać nasze nowe środowisko wirtualne.
Instalacja pakietów Python
Teraz w pierwszej kolejności aktywujmy środowisko wirtualne
conda activate BlogCharts
i możemy operować na nim jak na głównym.
Można sprawdzić jeszcze, jakie mamy pakiety:
conda list
Możesz teraz zainstalować najnowszy pakiet korzystając z komendy:
pip install pandas
albo z konkretną wersją (jeśli już miałeś ten pakiet to zostanie przeinstalowany na konkretną wersję):
pip install pandas==0.24.1

Dobra, przywróćmy najnowszą wersję na dziś (tj. 2021.02.12)
pip install --upgrade 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

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
a po drugie trzeba jeszcze dodać nasze środowisko wirtualne z odpowiednią nazwą:
python -m ipykernel install --user --name BlogCharts --display-name "BlogCharts"

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

lub zmieniając kernel już w otwartym notebooku:
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
Musisz jeszcze potwierdzić:
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

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:
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

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, prawda? 🙂
Mam nadzieję, że środowiska wirtualne sprawią, że łatwiej będzie Ci pracować nad projektami w języku Python.
Pozdrawiam z całego serducha,

Image by Waqutiar Rahaman from Pixabay
Złapałem się na bezwstydną promocję 😉
Pewnego czasu chciałem zainstalować środowisko do Anacondy żeby móc puścić sobie pewną symulację. Niestety z jakiegoś powodu przy instalacji mam błąd (błąd Python 3.5 jest nie obsługiwany, zalecono instalacje nowego Pythona). Jest to o tyle dziwne, że korzystam z wesji 3.10. Szukałem bezskutecznie odpowiedzi w internecie. Porzuciłem wtedy tą symulację. Niesamowicie frustrujące.
Pingback: NannyML - walidacja modelu bez danych rzeczywistych (ground truth)! - Mirosław Mamczur
Bez Condy ciężko jest pogodzić między sobą wersję. Pamiętam jak próbowałem na Vanilla Pythonie pobierać moduły…
Zgadza, się. Conda bardzo ułatwia życie 🙂
Mirek,
super pomocny post. 🙂 Mam tylko jedno pytanie – czy w środowisku conda instalacje poprzez pip nie spowodują problemów? Czy nie lepiej używać conda forge?
Hej Adam,
masz racje – jak jest dostępne Conda-forge warto go używać. Jednak większość bibliotek jak instaluję przez pip również działa ok 🙂