При розробці програм на 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
Після цього використання буде в такому форматі. Pislya tsʹoho vykorystannya bude v takomu formati.
pip install package_name1 package_name2
Ми можемо створити список усіх необхідних бібліотек у файлі requirements.txt (наприклад), перерахувавши їх у стовпчик.
packege_name1
package_name2
І потім скористатися ключем -r для передачі файлу-списку в інсталятор pip.
pip install -r requirements.txt
Де ще Python шукає бібліотеки під час імпорту?
Де ще 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/.