Рубрики
Без рубрики

Как работает «Установка PIP»

Взгляд под капотом в `pip install`. Теги с Python, Pip.

Что происходит, когда вы бежите PIP Установить ? Намного больше, чем вы думаете. Экосистема пакета Python довольно сложная.

Первый Пип нужно решить, какой Распределение пакета для установки. Это более сложный для Python, чем многие другие языки, поскольку каждая версия (или выпуск ) пакета Python обычно имеет несколько распределение . Есть 7 различных видов распределений, но наиболее распространенные в эти дни являются Распределение источника и бинарные колеса . Распространение источника – это именно то, что он говорит о TIN – RAW Python и потенциально C расширения, который написал разработчики пакета. Двоичное колесо – это более сложный архивный формат, который может содержать скомпилированный код расширения C. Это удобно для пользователей, потому что компиляция, скажем, numpy От источника занимает много времени (~ 4 минуты на моем рабочем столе), и у вас сложно, чтобы упаковать авторов, чтобы убедиться, что их исходный код будет сознавать на других народных машинах. Но это поставляется по цене – скомпилированный код специфичен для архитектуры, и часто ОС она была скомпилирована, поэтому большинство пакетов с расширениями C будут создавать несколько дистрибутивов колеса, а Пип необходимо решить, какой если какие-либо подходят для вашего компьютера.

Чтобы найти доступные дистрибутивы, Пип Запросы https://pypi.org/simple/ , которая представляет собой простую HTML-страницу, полную ссылок, где текст ссылки является имя файла распределения. Имя значения кодируют версию, тип распределения, а для двоичных колес, архитектуру и ОС они совместимы с. Этот формат достаточно сложен, чтобы быть покрыты двумя разными пепсами:

  • Схема версии покрыта Pep 440 Отказ
  • Бинарное колесо Filename Filename Tags Теги – предмет PEP 425 Отказ

Чтобы выбрать распределение, Пип Сначала определяет, какие распределения совместимы с вашей системой и внедрением Python. Для бинарных колес он анализирует имена файлов в соответствии с PEP 425, извлекая Реализация Python , Бинарный интерфейс приложения и платформа Отказ Реализация Python может быть что-то шире, что и py2.py3 (Значение «Любая реализация Python 2.x или 3.x») или может указать переводчик Python и основную версию, например PP35 (Значение Pypy версия 3.5). Двоичный интерфейс приложения, по сути, какая версия CPY’ом C-API C-API C-расширения C совместимся с, если есть. Интерпретация части платформы тега совместимости сложнее. Это может быть относительно очевидно, как Win32. для 32-битных окон, но я обычно устанавливаю manylinux1 колеса. Какие дистрибутивы Linux совместимы с manylinux1 является предметом тяжелых споров на Идутилс список рассылки. К счастью, процесс распределения источников является проще – все распределения источников считаются совместимыми, по крайней мере, на этом шаге в процессе.

Однажды Пип Имеет список совместимых распределений, он сортирует их версией, выбирает самую последнюю версию, а затем выбирает «лучшее» распределение для этой версии. Он предпочитает двоичные колеса, если есть какие-либо, и если они краны, он выбирает единственный, кто наиболее специфичен для установки среды. Это просто пипс Настройки по умолчанию, хотя они могут быть настроены с параметрами, такими как - Нет-двоичный или - Представитель - бинарный Отказ «Лучшее» распределение либо загружается, либо устанавливается из локального кеша, который на Linux обычно находится в ~/.cache/пипс .

Определение зависимостей для этого распределения также не просто. Теоретически, можно просто использовать требует_dist Значение от https://pypi.org/pypi///json Отказ Однако это зависит от автора пакета, загрузка правильных метаданных, а более старые упаковочные клиенты не делают этого. Так на практике Пип (И все, кто хочет знать зависимости пакета), должен скачать и осмотреть его.

Для двоичных колес зависимости перечислены в файле под названием Метаданные Отказ Но для распределения источников зависимости эффективно все равно устанавливаются при выполнении их setup.py Сценарий с установить команда. Там нет способа узнать, если вы не попробуете, это то, что Пип делает! В частности, он использует seturgools бежать Установить До такой степени, что знает какие зависимости для установки. Однако это может быть дополнительно осложняется тем, что работает Установить может сам требуют зависимости. Стандартный способ указать это в пакете Python – пройти setup_requires аргумент на seturgools.setup Отказ В порядке seturgools , Пип будет работать setup.py достаточно, чтобы открыть для себя setup_requires , установите эти зависимости, затем вернитесь и выполните setup.py снова. Естественно, это безумие и setup_requires никогда не следует использовать.

Однажды Пип Имеет список требований, он снова начинает весь этот процесс для каждого необходимого пакета с учетом любых ограничений на его версию. Это строит целое дерево пакетов таким образом, пока каждая зависимость каждого распределения она нашла, уже нашел в дереве. Этот процесс разрывается, конечно, если есть цикл зависимости, но он всегда будет расторгнуть- В конце концов, есть только конечное количество пакетов Python!

Что происходит, хотя если один из дистрибутивов Пип Находит нарушает требования другого, например, если это Пип Сначала находятся idna. Версия 2.5 Но затем находит распределение, требующее idna <= 2.4 ? Ну, он игнорирует требование и устанавливает idna. так или иначе! Есть Давняя проблема открыт, чтобы добавить истинную Зависимость Resolver к Пип , с большим количеством ложных начинающих и частичных реализаций, но никто не вполне добился этого. Это, конечно, в значительной степени из-за сложности определения зависимостей для пакета Python – очень трудно создать эффективную резолюцию зависимости при определении зависимостей A одинокий Кандидат требует загрузки и выполнения потенциально мегабайт кода!

Следующий Пип должен на самом деле строить и установить пакет. Если это скачало распределение источника, и колесо Установлен пакет, он сначала будет создать двоичное колесо специально для вашего машины из источника. Затем ему необходимо определить, какой каталог библиотеки устанавливать пакет в системе, пользователя или VirtualenV? Это контролируется sys.prefix , который в свою очередь контролируется пипс исполняемый путь и Пифит и Pythonhome Переменные среды. Наконец, он перемещает файлы колеса в соответствующую каталог библиотеки и компилирует исходные файлы Python в Bytecode для более быстрого выполнения.

Теперь ваш пакет установлен! Я действительно только поцарапал поверхность – есть десятки вариантов, которые меняются Пип Поведение, множество угловых случаев других типов распределения и ограничения платформы, и я даже не прикоснулся с установкой нескольких пакетов (который обрабатывается по-разному, чем пакет с несколькими зависимостями). Но я надеюсь, что это было информативно, если не полезно.

Оригинал: “https://dev.to/alexbecker/how-pip-install-works-323j”