Установка модулей Python3 с помощью pip

Выложена лекция из базового курса «Алгоритмы и алгоритмические языки», посвящённая установке и использованию произвольных модулей Python на примере Linux-окружения.

Не вполне стандартная (т. н. «offline») лекция из базового курса «Алгоритмы и алгоритмические языки», который Георгий Курячий читает дистанционно для Севастопольского филиала ВМК МГУ. В этой лекции бегло рассматривается инструмент установки модулей Python3 с портала Python Package Index (т. н. pip). Оказывается, развернуть свой собственный Online Python Tutor ючень легко: весь сайт написан на Python и распространяется под свободной лицензией!

Их там почти полмиллиона!

Базовая статья: «Установка модулей Python».

В состав «обычной полной» установки Python3 входит порядка 300 модулей. На сайте Python Package Index(PyPi) — более 400000 модулей (под свободной лицензией). Не все модули с сайта совместимы со всеми версиями Python и со всеми операционными системами.

В некоторых (например, основанных на Linux) операционных системах есть возможность оформить модуль Python как пакет ОС и добавить его в общее хранилище пакетов. Затем можно будет получать пакет из хранилища и устанавливать/удалять/обновлять стандартными для ОС методами.

Кроме того, сам Python предоставляет инструмент установки и удаления своих модулей — distutils (с расширением по имени setuptioos) и инструмент доставки — pip.

Примечание: Иногда в Linux-дистрибутивах может встретиться поддержка другого, устаревшего языка программирования — Python2. Для того, чтобы отличить одинаковые по назначению программы из установок Python3 и Python3, в их имена иногда добавляют номер версии. Например, pip может называться pip3, чтобы не путать с устаревшим pip2, и тому подобное. Если в вашей системе стоят оба варианта, убедитесь, что вы пользуетесь именно инструментов для Python3. Модули для различных версий Python располагаются в различных каталогах (например, /usr/lib64/python3), поэтому в модификации имён не нуждаются.

Примечание 2: Все дальнейшие примеры приведены для linux-систем, строка «$ » в начале примера означает, что команда вводится в ответ на приглашение интерпретатора командной строки linux. А вот примеры с python кроссплатформенны, и работают на любых ОС с установленным Python3.

Выполняя оператор import, Python3 ищет модули в каталогах, перечисленных в списке sys.path (из модуля sys). В начале этого списка есть пустая строка, что означает поиск в текущем каталоге. В примере интерпретатору передаётся с помощью ключа "-c" программа-«однострочник»:

$ python3 -c 'import sys; print(sys.path)'
['', '/usr/lib64/python310.zip', '/usr/lib64/python3.10', '/usr/lib64/python3.10/lib-dynload', '/home/george/.local/lib/python3/site-packages', '/usr/lib64/python3/site-packages', '/usr/lib64/python3/site-packages/gtk-2.0', '/usr/lib/python3/site-packages']

Никакой из этих каталогов не обязан существовать. Обратите внимание на zip-архив среди названий каталогов. Да, python может «заходить» в архивы в поисках нужного модуля!

Если python установлен с правами администратора (для Linux это норма, для Windows — как когда), обычному пользователю запрещено модифицировать системный каталоги с модулями Python3, поэтому стоит создать собственный (например, в домашнем каталоге — /home/altlinux/python) и добавлять его в sys.path в программе.

Можно добавить этот каталог в переменную окружения PYTHONPATH до запуска Python3, тогда его имя попадёт в sys.path на первое место (после пустой строки):

$ mkdir /home/altlinux/python
$ echo 'print("QQ")' > /home/altlinux/python/DUMMY.py
$ PYTHONPATH=/home/altlinux/python python3
Python 3.10.7 (main, Sep 13 2022, 12:33:40) [GCC 12.1.1 20220518 (ALT Sisyphus 12.1.1-alt1)] on linux
>>> import sys
>>> sys.path
['', '/home/altlinux/python', '/usr/lib64/python3.10', … ]
>>> import DUMMY
QQ

Обратите внимание на то, что нулевой элемент sys.path — это пустая срока: первым делом Python будет искать модули в текущем каталоге.

Пополнить sys.path можно и безо всякого Linux — просто добавляя туда нужный путь из python:

>>> import sys
>>> print(*sys.path)
 /usr/lib64/python310.zip /usr/lib64/python3.10 /usr/lib64/python3.10/lib-dynload /home/george/.local/lib/python3/site-packages /usr/lib64/python3/site-packages /usr/lib64/python3/site-packages/gtk-2.0 /usr/lib/python3/site-packages
>>> sys.path.append('/home/altlinux/python')
>>> print(*sys.path)
 … /usr/lib/python3/site-packages /home/altlinux/python
>>> import DUMMY
QQ

Умением Python искать модули в различных каталогах можно воспользоваться, чтобы не запоминать путь к программам. Дело в том, что команда вида "python -m <имя модуля>" найдёт модуль с соответствующим именем (в простом случае — <имя модуля>.py) среди PYTHONPATH и запустит его как программу (при этом глобальное имя name будет указывать на строку "main"). Многие модули проверяют, не запустили ли их как программу, и делают что-нибудь полезное в этом случае, примерно так:

$ cat /usr/lib64/python3.10/zipapp.py

… (тело модуля) …

if __name__ == '__main__':
    main()

Вот так, например, можно прочитать документацию по функции shuffle из модуля random:

$ python3 -m pydoc random.shuffle

А вот так — запустить полноценный WWW-сервер, который «отдаст» по адресу http://localhost:12345 все файлы текущего каталога:

$ python3 -m http.server 12345

Кстати, pydoc тоже может работать как WWW-вервер, показывая все строки документации, находящиеся во всех доступных модулях (в том числе и в наших программах, если они оказались в PYTHONPATH)

 1 python3 -m pydoc -p 4321
Server ready at http://localhost:4321/
Server commands: [b]rowser, [q]uit
server> b
server> q
Server stopped

Многие модули, размещённые на PyPi, можно устанавливать и удалять с помощью программы pip (или pip3), что есть не что иное, как вызов модуля pip. Следующие две команды просмотра установленных пакетов эквивалентны (в Windows Python3 и его pip скорее всего называется просто «python» и «pip»):

$ pip3 list

$ python3 -m pip list

Модули, в описании которых встречается, например, ключевое слово pep8, можно поискать на сайте PyPi примерно так: https://pypi.org/search/?q=pep8

Если Python установлен с правами пользователя (часто в Windows), то для установки, например, модуля pep8, достаточно выполнить команду «pip install pep8». Если сам Python установлен с правами администратора, то обычный пользователь не имеет права устанавливать модули в системный каталог с помощью pip. Да это и не нужно: в системных каталогах находятся файлы, входящие в состав самой операционной системы и её пакетов, и смешивать их с установленными вручную не стоит. В любой ОС для Python определён свой каталог пользовательских модулей в который будет производиться установка, если применить ключ "--user":

$ python3 -m pip list --user
$ python3 -m pip install pep8 --user
$ python3 -m pip list --user
$ python3 -c "import sys; print(sys.path)"

После первой же установки этот каталог сам появится в sys.path (точнее, Python обнаружит, что каталог существует, и включит его туда, сравним выдачу последней команды с предыдущей такой же).

Кстати сказать, установленный нами модуль проверяет выполнение рекомендаций PEP8 в предложенной ему программе на Python:

$ echo -e "import os, sys" > o.py
$ echo -e "print(os,sys)" >> o.py
$ python3 -m pep8 o.py
$ python3 o.py

В полученной программе из двух строк модуль pep8 нашёл два недочёта (посмотрите, каких), хотя сама программа работает без ошибок.

Посмотреть информацию о модуле можно командой pip show (не путать с peep show!), а ключ "-f" вдобавок покажет, из каких файлов модуль состоит:

$ pip show pep8 -f
Name: pep8
Version: 1.7.1
Summary: Python style guide checker
Home-page: http://pep8.readthedocs.org/
Author: Ian Lee
Author-email: IanLee1521@gmail.com
License: Expat license
Location: /home/george/.cache/tmpip/pep8/lib/python3/site-packages
Requires: 
Required-by: 
Files:
  ../../bin/pep8
  __pycache__/pep8.cpython-310.pyc
  pep8-1.7.1.dist-info/DESCRIPTION.rst
  pep8-1.7.1.dist-info/INSTALLER
  pep8-1.7.1.dist-info/METADATA
  pep8-1.7.1.dist-info/RECORD
  pep8-1.7.1.dist-info/REQUESTED
  pep8-1.7.1.dist-info/WHEEL
  pep8-1.7.1.dist-info/entry_points.txt
  pep8-1.7.1.dist-info/metadata.json
  pep8-1.7.1.dist-info/namespace_packages.txt
  pep8-1.7.1.dist-info/top_level.txt
  pep8.py

В Linux-системах каталог для установке модулей Python находится в домашнем каталоге и называется .local/lib/python3/site-packages. Таким образом, например, путь к файлу файл DESCRIPTION.rst получается таким: .local/lib/python3/site-packages/pep8-1.7.1.dist-info/DESCRIPTION.rst.

Оказывается, вместе с пакетом приехал и запускаемый файл, который лежит в каталоге /home/altlinux/.local/lib/python3.10/site-packages/../../../bin/, то есть (если аккуратно выходить в родительский каталог по каждому «../») в подкаталоге .local/bin домашнего каталога (напоминаем, что в linux домашний каталог и его подкаталоги — единственное место, где пользователь может хранить файлы).

Наконец, для удаления модуля достаточно выполнить команду pip uninstall <имя_модуля>.

Простой пример — попробуем найти среди модулей генератор случайных предложений в стиле "lorem ipsum". Это можно сделать в броузере на сайте PyPi.

Получим внушительный список модулей. Поскольку мы ничего особо про них не знаем, установим первый попавшийся:

$ pip3 install py-lorem --user
Collecting py-lorem
  Downloading py-lorem-1.2.tar.gz
Installing collected packages: py-lorem
  Running setup.py install for py-lorem ... done
Successfully installed py-lorem-1.2
$ pip3 show py-lorem
Name: py-lorem
Version: 1.2
Summary: Generate mock sentences/paragraphs with the Lorem Ipsum prose
Home-page: https://github.com/nubela/py-lorem
Author: nubela
Author-email: nubela@gmail.com
License: MIT
Location: /home/altlinux/.local/lib/python3/site-packages
Requires:

Зайдём на сайт разработчика и попытаемся написать пример. Он не заработает: проект слишком старый, с новым Python не совместим, удалим его

$ pip3 uninstall -y py-lorem
Uninstalling py-lorem-1.2:
  Successfully uninstalled py-lorem-1.2

Снова ищем на сайте PyPi проект посвежее. Установим его.

$ pip3 install lorem --user
Collecting lorem
  Downloading lorem-0.1.1-py3-none-any.whl
Installing collected packages: lorem
Successfully installed lorem-0.1.1
$ pip3 show -f lorem
Name: lorem
Version: 0.1.1
Summary: Generator for random text that looks like Latin.
Home-page: https://github.com/sfischer13/python-lorem
Author: Stefan Fischer
Author-email: sfischer13@ymail.com
License: MIT
Location: /var/home/george/.local/lib/python3/site-packages
Requires:
Files:
  lorem-0.1.1.dist-info/DESCRIPTION.rst
  lorem-0.1.1.dist-info/INSTALLER
  lorem-0.1.1.dist-info/METADATA
  lorem-0.1.1.dist-info/RECORD
  lorem-0.1.1.dist-info/WHEEL
  lorem-0.1.1.dist-info/metadata.json
  lorem-0.1.1.dist-info/top_level.txt
  lorem/__init__.py
  lorem/__pycache__/__init__.cpython-35.pyc
  lorem/__pycache__/data.cpython-35.pyc
  lorem/__pycache__/text.cpython-35.pyc
  lorem/data.py
  lorem/text.py

Пример с сайта PyPi вполне работает

import lorem

s = lorem.sentence()  # 'Eius dolorem dolorem labore neque.'
p = lorem.paragraph()
t = lorem.text()

print(s)
print("+"*24)
print(p)
print("+"*24)
print(t)

Пример из жизни

TODO слегка переписать.

Прекрасный учебный инструмент — Online Python Tutor — во-первых, свободный программный продукт (стало быть его можно эксплуатировать и изменять безо всяких ограничений), а во-вторых, написан на Python (с интерфейсом на JavaScript). Стандартный WWW-сервер Python3 для OnlinePythonTutor недостаточен, нужно использовать несколько более «продвинутый» WGSI-сервер bottle, который, как и следовало ожидать, — просто модуль Python.

$ python3 -m pip search bottle
$ python3 -m pip install bottle --user
$ python3 -m pip show bottle -f

Как видно, модуль состоит из одного файла :).

Скачаем и распакуем исходные тексты OnlinePythonTutor (так как Python и JavaScript — интерпретируемые языки, никакой компиляции они не потребуют). Ради чистоты эксперимента и скачивание, и распаковку напишем тоже на Python3 (это ненамного сложнее, чем делать вручную, средствами операционной системы).

Скачивание (в файл OPT.zip):

import urllib.request
urllib.request.urlretrieve("https://github.com/sineagles/OnlinePythonTutor/archive/refs/heads/master.zip", "OPT.zip")

Распаковка (ради пущего пафоса запустим графический диалог, позволяющий выбрать каталог для распаковки):

from tkinter.filedialog import askdirectory
from zipfile import ZipFile

zfile = ZipFile("OPT.zip")
extract_path = askdirectory()
zfile.extractall(extract_path)

Мы не закрыли открытый объект ZipFile, это нехорошо, но так как он всего один и открыт на чтение, ничего страшного в том, что Python3 закроет его за нас, нету.

При распаковке образуется каталог OnlinePythonTutor-master, а нужная нам версия лежит (по состоянию на конец 2016 года) в подкаталоге v5-unity.

Теперь можно запускать сервер, это программа на Python под именем bottle_server.py

Если запускать из командной строки, то сначала в эот каталог надо перейти (клик из какого-нибудь файлового менеджера автоматически поменяет текущий каталог)

$ cd OnlinePythonTutor-master/v5-unity
$ python3 bottle_server.py
Bottle v0.12.10 server starting up (using WSGIRefServer())...
Listening on http://localhost:8003/
Hit Ctrl-C to quit.

127.0.0.1 - - [07/Dec/2016 16:48:35] "GET /live.html HTTP/1.1" 200 5505
127.0.0.1 - - [07/Dec/2016 16:48:35] "GET /build/opt-live.bundle.js?9e05a8f2ec HTTP/1.1" 200 1936737
. . .

Зайдите браузером по адресу http://localhost:8003/live.html . если всё сделано правильно, там вас ждёт работающая копия Online Python Tutor!


CategoryArticle

FrBrGeorge/News/2016-12-07 (последним исправлял пользователь FrBrGeorge 2016-12-07 17:52:56)