Środowiska wirtualne i zarządzanie zależnościami w Pythonie

Piotr Grzesik

Pragmatic Coders

Agenda

  1. Pyenv - zarządzamy wersjami Pythona
  2. Virtualenvs - środowiska wirtualne
  3. Pyenv + virtualenv
  4. Pip
  5. Conda
  6. Zarządzanie zależnościami - dlaczego powinniśmy się tym przejmować ? 
  7. 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

  1. Zmienna środowiskowa PYENV_VERSION (komenda pyenv shell)
  2. Plik .python-version w aktualnym katalogu (można go utworzyć komendą pyenv local)
  3. Plik .python-version w katalogu nadrzędnym (aż do /)
  4. 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

Made with Slides.com