Środowiska wirtualne i zarządzanie zależnościami w Pythonie
Piotr Grzesik
Pragmatic Coders
Agenda
- Pyenv - zarządzamy wersjami Pythona
- Virtualenvs - środowiska wirtualne
- Pyenv + virtualenv
- Pip
- Conda
- Zarządzanie zależnościami - dlaczego powinniśmy się tym przejmować ?
- pip-tools, Pipfile, pipenv
Pyenv - zarządzamy wersjami Pythona
(https://github.com/pyenv/pyenv)
- Narzędzie do zarządzania wersjami intepretera Pythona
- Wspiera CPython, PyPy, Stackless, JPython, IronPython
- Podobne do nvm (node.js) czy rvm (Ruby)
- Zarządzanie globalną wersją dla użytkownika
- Konfiguracja wersji dla konkretnego projektu
Pyenv - shims
- Pyenv dodaje na początku PATH scieżkę ~/.pyenv/shims
- Shims zawiera executable jak pip, python, etc.
- Są odpowiedzialne za przekazanie wywołania do pyenv
Kolejność wyboru wersji interpretera
- Zmienna środowiskowa PYENV_VERSION (komenda pyenv shell)
- Plik .python-version w aktualnym katalogu (można go utworzyć komendą pyenv local)
- Plik .python-version w katalogu nadrzędnym (aż do /)
- Plik ~/.pyenv/version (komenda pyenv global)
Demo pyenv
Virtualenvs - środowiska wirtualne w Pythonie
- Służy do tworzenia izolowanych środowisk
- Każde ze środowisk ma odrębne zależności (np. środowiska mające różne wersje tej samej biblioteki)
- Pozwala testować biblioteki(zewnętrzne lub własne), bez zaśmiecania systemowego Pythona
- Od Pythona 3.3 część biblioteki standardowej (PEP 405)
Virtualenv - jak używać
~ pip install virtualenv
~ virtualenv /path/to/env
Python < 3.3
~ pyvenv /path/to/env
Python 3.3 i wyżej (deprecated od wersji 3.6)
Rekomendowane od wersji 3.5
~ python3 -m venv /path/to/env
Aktywacja utworzonego virtualenva
~ source /path/to/env/bin/activate
Deaktywacja utworzonego virtualenva
~ deactivate
Virtualenv - jak działa ?
- Activate - dodaje na początku PATH ścieżkę /path/to/env/bin
- Biblioteki instalowane są do /path/to/env/lib/pythonX.Y/site-packages
- 3rd party virtualenv - zmodyfikowany site.py, orig-prefix.txt pozwala na dołączenie biblioteki standardowej (sys.prefix)
- Wbudowany virtualenv - plik pyvenv.cfg (sys.prefix i sys.base_prefix)
Pyenv + virtualenv
(https://github.com/pyenv/pyenv-virtualenv)
- Plugin do pyenva pozwalający na zarządzanie virtualenvami, a także środowiskami stworzonymi za pomocą conda
- Wspiera zarówno virtualenv jak i venv będący częścią biblioteki standardowej
Pyenv-virtualenv demo
Pip
- Rekomendowany przez PyPA (Python Packaging Authority) instalator pakietów
- Automatyczna instalacja przy używaniu virtualenv lub pyvenv
- Dystrybuowany wraz z Pythonem >=2.7.9 i >=3.4
- Domyślnie instaluje paczki z pypi.python.org/pypi
Pip - przydatne komendy
pip install package
pip install 'package>=1.0'
pip install package==1.0
pip install -r requirements.txt
pip uninstall package
pip list
pip list --outdated
pip freeze
pip freeze > requirements.txt
pip show package
pip search "query"
Conda
(https://github.com/conda/conda)
- Pozwala zarządzać zarówno pakietami jak i środowiskami
- Wieloplatformowość (Win/macOS/Linux)
- Zarządzanie wersjami Pythona (od 2.6.8 do 3.6.1)
- Instalacja paczek wewnątrz utworzonych środowisk również za pomocą pip'a
- Instalacja binarnych pakietów (brak konieczności kompilacji podczas instalacji)
- Możliwość instalacji pakietów napisanych w innych językach np. C/C++, Java, Scala, JavaScript, FORTRAN, R
Zarządzanie zależnościami - dlaczego powinniśmy się tym przejmować ?
- Lista bibliotek, z których korzysta nasza aplikacja (najczęściej plik requirements.txt)
- Logiczny podział zależności (np. oddzielna lista zależności do testów)
- Stabilne i powtarzalne buildy na różnych środowiskach
pip-tools
(https://github.com/jazzband/pip-tools)
- Narzędzie pozwalające "przypinać" zależności
- pip-compile + pip-sync
pip-tools demo
Pipfile
(https://github.com/pypa/pipfile)
- "Requirements.txt" 2.0 - propozycja nowego standardu
- Inicjatywa PyPA (Python Packaging Authority)
- Zastąpienie "requirements.txt" przy pomocy Pipfile oraz Pipfile.lock
- Pipfile - składnia TOML, zawiera podstawowe zależności oraz ich źródło
- Pipfile.lock - zawiera deterministyczny zestaw zależności, pozwalający na powtarzalny deployment aplikacji
Przykładowy Pipfile
[dev-packages]
pytest = "*"
mock = "*"
"delegator.py" = "*"
toml = "*"
Sphinx = "*"
[packages]
pew = ">=0.1.26"
Przykładowy Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "b22d25806ebb5d3050975a015bcdf85cc363a550216e4bf16eec5a6194e99007"
},
"sources": [
{
"url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
},
"default": {
"appdirs": {
"version": "==1.4.3"
},
(...)
"virtualenv-clone": {
"version": "==0.2.6"
}
},
"develop": {
"Babel": {
"version": "==2.3.4"
},
(...)
"toml": {
"version": "==0.9.2"
}
}
}
pipenv
(https://github.com/kennethreitz/pipenv)
- Połączenie pip, Pipfile oraz virtualenv
- Automatycznie tworzy virtualenva jeśli nie istnieje
- Automatycznie dodaje/usuwa zależności do Pipfile podczas ich instalacji/usuwania
- Tworzenie pliku Pipfile.lock
- Instalacja zależności z Pipfile.lock
Pytania ?
@p_grzesik
pj.grzesik@gmail.com
Środowiska wirtualne i zarządzanie zależnościami w Pythonie
By progressive
Środowiska wirtualne i zarządzanie zależnościami w Pythonie
- 963