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. Створення віртуальних середовищ

Модуль, який використовується для створення та керування віртуальними середовищами, називається venv. venv зазвичай встановлює останню доступну версію Python. Якщо у вас є кілька версій Python у вашій системі, ви можете вибрати конкретну версію Python, запустивши python3 або будь-яку іншу версію.

Щоб створити віртуальне середовище, виберіть каталог, куди ви хочете його розмістити, і запустіть модуль 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 має низку підкоманд: «встановити», «видалити», «заморозити» тощо. (Зверніться до посібника Встановлення модулів Python, щоб отримати повну документацію для 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 Встановлення модулів Python 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.