Basics of Python and Django. / Урок 3. Кортежи. Словари. / Виртуальное окружение. Установщик PIP.
Установщик pip. Виртуальное окружение.
При разработке программ на Python часто возникает необходимость в установке сторонних библиотек (пакетов) , не входящих в поставку Python.
После установки появляется возможность их импорта и использования.
Установить пакет python можно вручную, распаковав архив в нужное место.
Первым делом Python пытается найти импортируемую библиотеку в текущем каталоге.
Это можно проверить, создав файл библиотеки mylib.py.
print('Importing mylib')
И в другом файле попытаться его импортировать.
import mylib
Вывод.
shell>python imp.py
Importing mymodule
shell>
Если файл положить в каталог lib например, то импорт будет следующим:
import lib.mylib
При этом необходимо не забыть создать в каталоге специальный файл init.py который обозначит этот каталог как пакет и сделает возможным импорт из него.
Установщик pip облегчает задачу установки пакетов.
Он оперирует репозиторием пакетов на сайте https://pypi.org и тянет их от туда.
Установить его в систему можно командой.
apt install python-pip
После чего использование будет в таком формате.
pip install package_name1 package_name2
Мы можем создать список всех необходимых библиотек в файле requirements.txt (например) перечислив их в столбик.
packege_name1
package_name2
И потом воспользоваться ключем -r для передачи файла-списка в установщик pip.
pip install -r requirements.txt
Где еще Python ищет библиотеки при импорте?
Посмотреть все пути по которым проходит поиск можно в переменной PYTHONPATH, используя модуль sys.
Этот модуль взаимодействует напрямую с интерпретатором Python.
import sys
print(sys.path)
Можно запустить одной командой прямо из bash консоли.
python -c "import sys; print('\n'.join(sys.path))"
Вывод
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/home/zdimon/.local/lib/python2.7/site-packages
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages/PILcompat
/usr/lib/python2.7/dist-packages/gtk-2.0
/usr/lib/python2.7/dist-packages/ubuntu-sso-client
/usr/lib/python2.7/dist-packages/wx-3.0-gtk2
Как видим почти все пути являются системными и прав на запись в них имеет только привелигерованные пользователи.
Поэтому при попытке просто установить какой либо пакет запустив к примеру
pip install markdown
Вы получите ошибку прав доступа так как текущий пользователь не может писать в /usr/local/lib/python2.7/dist-packages.
ERROR: Could not install packages due to an EnvironmentError:
[Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/markdown
Выход из этой ситуации - это изменить переменную окружения интерпретатора sys.path, указав в нем путь нашего проекта вместо системных путей.
Это обеспечивает такая программа как virtualenv.
Установка
apt install virtualenv
Создание виртуального окружения.
virtualenv venv # python 2
virtualenv -p python3 venv # python 3
При этом venv - произвольное имя папки, которая создается в текущей директории.
Обычно ее создают рядом с директорией проекта, или внутри нее.
После создания этой директории необходимо запустить bash скрипт activate из каталога venv/bin.
Именно он и будет изменять пути в sys.path к нашим зависимостям.
После активации мы увидим префикс (venv) в командной строке консоли, означающий то, что теперь при использовании pip установщика он будет ставить пакеты не в системные каталоги а внутрь нашего виртуального окружения.
Это каталог venv/lib/python3.5/site-packages/.