# 12. Віртуальні середовища та пакети

## 12.1. вступ

Програми Python часто використовують пакети та модулі, які не є частиною стандартної бібліотеки. Програмам іноді потрібна конкретна версія бібліотеки, тому що програма може вимагати виправлення певної помилки або програма може бути написана з використанням застарілої версії інтерфейсу бібліотеки.

Це означає, що одна установка Python може не відповідати вимогам кожної програми. Якщо програмі A потрібна версія 1.0 певного модуля, а програмі B потрібна версія 2.0, тоді вимоги суперечать, і встановлення версії 1.0 або 2.0 призведе до того, що одна програма не зможе працювати.

Рішенням цієї проблеми є створення virtual environment, самостійного дерева каталогів, яке містить інсталяцію Python для певної версії Python, а також низку додаткових пакетів.

Тоді різні програми можуть використовувати різні віртуальні середовища. Щоб вирішити попередній приклад суперечливих вимог, програма A може мати власне віртуальне середовище з версією 1.0, а програма B має інше віртуальне середовище з версією 2.0. Якщо програма B потребує оновлення бібліотеки до версії 3.0, це не вплине на середовище програми A.

## 12.2. Створення віртуальних середовищ

The module used to create and manage virtual environments is called `venv`. `venv` will install the Python version from which the command was run (as reported by the `--version` option). For instance, executing the command with `python3.12` will install version 3.12.

Щоб створити віртуальне середовище, виберіть каталог, куди ви хочете його розмістити, і запустіть модуль `venv` як сценарій із шляхом до каталогу:

    python -m venv tutorial-env

Це створить каталог `tutorial-env`, якщо він не існує, а також створить каталоги всередині нього, що містять копію інтерпретатора Python і різні допоміжні файли.

Загальним розташуванням каталогу для віртуального середовища є `.venv`. Ця назва зберігає каталог, як правило, прихованим у вашій оболонці і, таким чином, не заважаючи, водночас надаючи йому назву, яка пояснює, чому каталог існує. Це також запобігає зіткненню з файлами визначення змінних середовища `.env`, які підтримують деякі інструменти.

Створивши віртуальне середовище, ви можете його активувати.

У Windows запустіть:

    tutorial-env\Scripts\activate

В Unix або MacOS запустіть:

    source tutorial-env/bin/activate

(Цей сценарій написаний для оболонки bash. Якщо ви використовуєте оболонки csh або fish, існують альтернативні сценарії `activate.csh` і `activate.fish`, які вам слід використовувати замість цього.)

Активація віртуального середовища змінить підказку вашої оболонки, щоб показати, яке віртуальне середовище ви використовуєте, і змінить середовище таким чином, що запуск `python` дасть вам цю конкретну версію та інсталяцію Python. Наприклад:

    $ source ~/envs/tutorial-env/bin/activate
    (tutorial-env) $ python
    Python 3.5.1 (default, May  6 2016, 10:59:36)
      ...
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python35.zip', ...,
    '~/envs/tutorial-env/lib/python3.5/site-packages']
    >>>

To deactivate a virtual environment, type:

    deactivate

into the terminal.

## 12.3. Керування пакетами за допомогою pip

You can install, upgrade, and remove packages using a program called pip. By default `pip` will install packages from the Python Package Index. You can browse the Python Package Index by going to it in your web browser.

`pip` має низку підкоманд: «встановити», «видалити», «заморозити» тощо. (Зверніться до посібника Installing Python modules, щоб отримати повну документацію для `pip`.)

Ви можете встановити останню версію пакета, вказавши назву пакета:

    (tutorial-env) $ python -m pip install novas
    Collecting novas
      Downloading novas-3.1.1.3.tar.gz (136kB)
    Installing collected packages: novas
      Running setup.py install for novas
    Successfully installed novas-3.1.1.3

Ви також можете встановити певну версію пакета, вказавши ім’я пакета, а потім `==` і номер версії:

    (tutorial-env) $ python -m pip install requests==2.6.0
    Collecting requests==2.6.0
      Using cached requests-2.6.0-py2.py3-none-any.whl
    Installing collected packages: requests
    Successfully installed requests-2.6.0

If you re-run this command, `pip` will notice that the requested version is already installed and do nothing. You can supply a different version number to get that version, or you can run `python -m pip install --upgrade` to upgrade the package to the latest version:

    (tutorial-env) $ python -m pip install --upgrade requests
    Collecting requests
    Installing collected packages: requests
      Found existing installation: requests 2.6.0
        Uninstalling requests-2.6.0:
          Successfully uninstalled requests-2.6.0
    Successfully installed requests-2.7.0

`python -m pip uninstall` followed by one or more package names will remove the packages from the virtual environment.

`python -m pip show` will display information about a particular package:

    (tutorial-env) $ python -m pip show requests
    ---
    Metadata-Version: 2.0
    Name: requests
    Version: 2.7.0
    Summary: Python HTTP for Humans.
    Home-page: http://python-requests.org
    Author: Kenneth Reitz
    Author-email: me@kennethreitz.com
    License: Apache 2.0
    Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
    Requires:

`python -m pip list` will display all of the packages installed in the virtual environment:

    (tutorial-env) $ python -m pip list
    novas (3.1.1.3)
    numpy (1.9.2)
    pip (7.0.3)
    requests (2.7.0)
    setuptools (16.0)

`python -m pip freeze` will produce a similar list of the installed packages, but the output uses the format that `python -m pip install` expects. A common convention is to put this list in a `requirements.txt` file:

    (tutorial-env) $ python -m pip freeze > requirements.txt
    (tutorial-env) $ cat requirements.txt
    novas==3.1.1.3
    numpy==1.9.2
    requests==2.7.0

Після цього `requirements.txt` можна закріпити для контролю версій і відправити як частину програми. Потім користувачі можуть інсталювати всі необхідні пакети за допомогою `install -r`:

    (tutorial-env) $ python -m pip install -r requirements.txt
    Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
      ...
    Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
      ...
    Collecting requests==2.7.0 (from -r requirements.txt (line 3))
      ...
    Installing collected packages: novas, numpy, requests
      Running setup.py install for novas
    Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

`pip` has many more options. Consult the Installing Python modules guide for complete documentation for `pip`. When you’ve written a package and want to make it available on the Python Package Index, consult the Python packaging user guide.