Установка модулей 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!