30 września 2020
Python venv 1on1
Zakładam, że masz zainstalowany python na komputerze globalnie i potrafisz z niego korzystać na poziomie postawowym 🖖
We współczesnym świecie programowania pisanie wszystkiego "od zera" nie jest zbyt efektywne. Przeważnie okazuje się, że problem, z którym się zmagasz został już przez kogoś rozwiązany i możesz po niego sięgnąc z pypi.org czyli Python Package Index. Biblioteki są utrzymywane i rozwijane, co za tym idzie wersjonowane. Niestety posiadanie różnych wersji pakietów/bibliotek w obrębie jednego systemu operacyjnego nie jest dobrym pomysłem 😵.
Za dobrą praktykę uznawane jest zakładanie wirtualnych środowisk python'a na potrzeby projektu/repozytorium. Na nasze szczęście python 3+ posiada wbudowany moduł, który w prosty sposób umożliwia te zagadnienie rozwiązać. Moduł o nazwie venv.
Jeśli instalowałeś już cokolwiek z pypi wiesz, że wystarczy użyć komendy
pip install <nazwa-pakietu>
Lub jeśli chcemy określoną wersję
pip install <nazwa-pakietu>==<wersja.pakietu>
Niestety wtedy pakiety instalowane są globalnie, czyli tam gdzie znajduje się twój python. W przypadku kilku wersji pakietu można napotkać spore problemy z doprowadzeniem niektórych rzeczy do uruchamialności 😓
Rozwiązaniem jest użycie venv'a. Załóżmy, że chcę rozpocząć nowy projekt od zera i będę potrzebować popularnej biblioteki requests. Jedyne co muszę zrobić to wykonać kilka operacji z cmd 🤖
Tworzę folder na projekt i wchodzę do niego
D:\code\blog>mkdir venv1n1
D:\code\blog>cd venv1n1
Następnie tworzę venv'a
D:\code\blog\venv1n1>python -m venv env
Parametr -m oznacza moduł, venv to nazwa modułu, natomiast env to nazwa/path naszego wirtualnego środowiska. Z racji tego, że komendę wywołałem w folderze venv1n1/ zostanie utworzony folder venv1n1/env/, który będzie posiadał oddzielną pustą instalację pythona pod mój projekt.
Important - jeśli zamierzasz trzymać projekt w repozytorium, pamiętaj aby zawsze dodać folder z virtualnym środowiskiem do .gitignore !☝️
Ok, stworzyłem środowisko ale jak mam tam instalować pakiety 🤔? Przecież pip install
instaluje je globalnie. Jedyne o czym trzeba pamiętać to aktywować środowisko i w nim wywoływać te same komendy instalacyjne co zawsze 🧠
Aby aktywować środowisko musimy:
Windows
D:\code\blog\venv1n1>env\Scripts\activate
Linux\MacOS
path/to/my/venv1n1>. env\scripts\activate
Jeśli wykonałem wszystko poprawnie nazwa środowiska powinna pojawić się na początku prompt'a w terminalu.
(env) D:\code\blog\venv1n1>
Oznacza to, że każda operacja związana z python'em będzie kierowana do instalacji znajdującej się w venv1n1/env/
Instalujemy requests
(env) D:\code\blog\venv1n1>pip install requests
Collecting requests
Downloading requests-2.24.0-py2.py3-none-any.whl (61 kB)
|████████████████████████████████| 61 kB 1.1 MB/s
Collecting chardet<4,>=3.0.2
Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
|████████████████████████████████| 133 kB 3.3 MB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Downloading urllib3-1.25.10-py2.py3-none-any.whl (127 kB)
|████████████████████████████████| 127 kB ...
Collecting certifi>=2017.4.17
Using cached certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Collecting idna<3,>=2.5
Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Installing collected packages: chardet, urllib3, certifi, idna, requests
Successfully installed certifi-2020.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.10
WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.
You should consider upgrading via the 'd:\code\blog\venv1n1\env\scripts\python.exe -m pip install --upgrade pip' command.
Sprawdzamy instalację
(env) D:\code\blog\venv1n1>pip freeze
certifi==2020.6.20
chardet==3.0.4
idna==2.10
requests==2.24.0
urllib3==1.25.10
Komenda pip freeze listuje wszyskie biblioteki zainstalowane w aktywnym środowisku python'a czyli w naszym przypadku z naszego env.
Jeśli chcemy wersjonować/przechowywać informacje na temat tego jakie biblioteki są wymagane dla naszego projektu, możemy je w prosty sposób zapisać do pliku tekstowego
(env) D:\code\blog\venv1n1>pip freeze > requirements.txt
Następnie jeśli chcemy zainstalować wszystkie biblioteki potrzebne do uruchomienia naszego projektu (powiedzmy na innym komputerze, lub na potrzeby CI/CD)
(env) sciezka\do\projektu>pip install -r requirements.txt
Gotowe 🤖 Od dziś nie muszę instalować bibliotek, globanie 👀. Dodatkowo jeśli będę miał problemy z env'em, to mogę go poprostu usunąć/przeinstalować/zdebugować 👍