Что есть pip? pip есть стандартный менеджер пакетов для Python. Он позволяет устанавливать и управлять дополнительными пакетами, которые не входят в стандартную библиотеку Python. Этот туториал есть введение в pip для новичков‑питонистов.

В этом туториале вы научитесь:

  • Устанавливать дополнительные пакеты, не включенные в стандартный дистрибутив Python.
  • Искать пакеты опубликованные в реестре пакетов Python (PyPI)
  • Управлять требованиями к сценариям и приложениям
  • Удалять пакеты и зависимости

В дальнейшем вы увидите, что сообщество Python активно создаёт аккуратные альтернативы pip, но об этом позже.

Содержание

Быстрый старт с pip

Итак, что есть pip? pip — менеджер пакетов Python. Это инструмент, который позволяет устанавливать и управлять дополнительными библиотеками, не вошедшими в стандартную библиотеку, и зависимостями между ними.

Управление пакетами настолько важно, что pip был включен в установщик Python начиная с версий 3.4 для Python 3 и 2.7.9 для Python 2. Он используется в большинстве проектов на Python и делает его незаменимым инструментом для каждого питониста.

Концепция управления пакетами может быть вам уже знакома, если вы работаете с другими языками. JavaScript использует npm в качестве менеджера пакетов, Ruby использует gem, а в .NET эту роль выполняет NuGet. В Python стандартным менеджером пакетов стал pip.

Установщик Python автоматически устанавливает pip, если это не древняя версия Python. Чтобы убедиться в доступности pip, выполните в терминале следующую команду:

$ pip --version
pip 18.1 from C:\Python37\lib\site-packages\pip (python 3.7)

Вы должны увидеть похожее сообщение, показывающее версию pip, а также место расположения и версию Python. Если вы используете старую версию Python, в которой нет pip, то можете установить его, следуя инструкциям для вашей системы в документации по установке pip.

Возможно, вы захотите испытать приведенные в этом руководстве примеры в виртуальной среде, во‑избежании установки пакетов глобальной установки Python. Можно узнать о виртуальных средах в Виртуальная среда Python: Учебник для начинающих. В разделе Использование виртуальной среды из этого туториала вы узнаете об основах создание новых виртуальных сред.

Установка пакетов с pip

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

В то же самое время у Python есть очень активное сообщество, которое предлагает на всеобщее рассмотрение просто огромный набор пакетов на «любой вкус и цвет», очень значительно способствующих разработке. Такие пакеты публикуются в Реестре пакетов Python, известном под интригующем именем PyPI (произносится как «ПиПей»). PyPI содержит обширную коллекцию пакетов, в том числе и виртуальные среды разработки, инструменты и библиотеки.

Многие из этих пакетов упрощают разработку на Python, предоставляя дружественные интерфейсы для функций, которые уже существуют в стандартной библиотеке. Например, можно написать скрипт, который извлекает содержимое веб-страницы, используя только стандартные библиотеки, включенные в Python:

# In using-http.py

import cgi
import http.client

server = 'www.google.com'
url = '/'
conn = http.client.HTTPSConnection(server)
conn.request('GET', url)
response = conn.getresponse()
content_type = response.headers.get('Content-Type')
_, params = cgi.parse_header(content_type)
encoding = params.get('charset')
data = response.read()
text = data.decode(encoding)

print(f'Response returned: {response.status} ({response.reason})')
print('Body:')
print(text)

В этом сценарии импортируется cgi и http.client, включенные в стандартную библиотеку Python. Создаётся объект HTTPSConnection специфицирующий сервер и делается .request() после чего вызывается .getresponse() для получения ответа.

В ответе можно прочитать Content-Type заголовка и распарсив его, используя модуль cgi извлечь имя набора символов кодировки страницы.

cgi.parse_header() возвращает кортеж с основным значением и словарь параметров. Например, заголовок Content-Type может содержать значение text/html; charset=ISO-8859-1.

Первым элементом кортежа является строка text/html, а слеующим элементом будет словарь {'charset': 'ISO-8859-1'}. Поскольку нас интересует только значение параметра charset, то можно игнорировать начало кортежа, и использовать подчёркивание: _, params = cgi.parse_header(content_type).

Зная кодировку страницы, можно прочитать ответ и расшифровать его в текст. Можно запустить этот пример в консоли и посмотреть, как он работает:

$ python using-http.py

Response returned: 200 (OK)
Body:
;;;;;... Additional Output Omitted

Извлечение содержимого веб-страницы это очень даже приличная работа для такого маленького скрипта. К счастью, есть пакет Python, который за счет хорошего интерфейса ещё более упрощает HTTP‑запросы и позволяет делать именно то, что хотите.

Базовая установка пакета

В PyPI находится очень популярная библиотека для выполнения HTTP‑запросов, которая называется requests. Можно узнать все об этом в документации на официальном сайте.

Первый шаг — установить пакет requests в вашу среду. Можно узнать о поддерживаемых командах pip, запустив их с помощью help:

$ pip help

Usage:
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible 
                              dependencies.
  config                      Manage local and global configuration.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment 
                              variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be 
                              used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be 
                              used up to 3 times (corresponding to WARNING, 
                              ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form 
                              [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should 
                              attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: 
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).
  --trusted-host <hostname>   Mark this host as trusted, even though it does 
                              not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file 
                              containing the private key and the certificate in 
                              PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine 
                              whether a new version of pip is available for 
                              download. Implied with --no-index.

В pip есть команда install для установки пакетов. Можно запустить его для установки пакета requests:

$ pip install requests

Looking in indexes: https://pypi.org/simple
Collecting requests
  Using cached 
  https://files.pythonhosted.org/packages/7d/e3/
  20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/
  requests-2.21.0-py2.py3-none-any.whl
Collecting chardet<3.1.0,>;=3.0.2 (from requests)
  Using cached https://files.pythonhosted.org/packages/bc/a9/
  01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/
  chardet-3.0.4-py2.py3-none-any.whl
Collecting idna<2.9,>;=2.5 (from requests)
  Using cached https://files.pythonhosted.org/packages/14/2c/
  cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/
  idna-2.8-py2.py3-none-any.whl
Collecting urllib3<1.25,>;=1.21.1 (from requests)
  Using cached https://files.pythonhosted.org/packages/62/00/
  ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/
  urllib3-1.24.1-py2.py3-none-any.whl
Collecting certifi>;=2017.4.17 (from requests)
  Using cached https://files.pythonhosted.org/packages/9f/e0/
  accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/
  certifi-2018.11.29-py2.py3-none-any.whl
Installing collected packages: chardet, idna, urllib3, certifi, requests
Successfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 
  requests-2.21.0 urllib3-1.24.1
You are using pip version 18.1, however version 19.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' 
  command.

После выполнения команды вы должны увидеть что-то похожее, на приведенное выше. Здесь pip с командой install, за которой следует имя пакета для установки. pip ищет пакет в PyPI, определяет его зависимости и устанавливает их для нормальной работы requests.

Кроме того, Можно заметить, что в текущей среде используется pip версии 18.1, но сейчас доступна версия 19.0.1 и поэтому внизу есть подсказка команды для обновления. Давайте сделаем это:

$ python -m pip install --upgrade pip

Looking in indexes: https://pypi.org/simple
Collecting pip
  Downloading https://files.pythonhosted.org/packages/46/dc/
  7fd5df840efb3e56c8b4f768793a237ec4ee59891959d6a215d63f727023/
  pip-19.0.1-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 2.0MB/s
Installing collected packages: pip
  Found existing installation: pip 18.1
    Uninstalling pip-18.1:
      Successfully uninstalled pip-18.1
Successfully installed pip-19.0.1

Для обновления pip вы используете команду python -m, ключ -m указывает Python запускать модуль как исполняемый файл. Это необходимо при обновлении потому, как старую версию pip необходимо удалить перед установкой новой, а удаление ее во время работы интерпретатора может вызвать ошибки.

При запуске pip как модуля, Python загружает его в память и позволяет удалить пакет при его работе. Пакеты можно запускать в качестве сценариев, если они содержат сценарий верхнего уровня __ main__ .py.

Теперь, когда вы установили requests и обновили pip, можно использовать команду list для просмотра пакетов, установленных в вашей среде:

$ pip list

Package    Version
---------- ----------
certifi    2018.11.29
chardet    3.0.4
idna       2.8
pip        19.0.1
requests   2.21.0
setuptools 40.6.2
urllib3    1.24.1

Как видите, pip обновлен до версии 19.0.1 (последняя версия на данный момент) и установлен requests версии 2.21.0.

Команда pip install <package>; всегда ищет последнюю версию пакета и устанавливает его. Он также выполняет поиск зависимостей, перечисленных в метаданных пакета и устанавливает эти зависимости, чтобы пакет соответствовал всем необходимым требованиям.

Как видите, одной командой установки requests на самом деле было установлено несколько пакетов. Можно посмотреть метаданные пакета, используя команду show в pip:

$ pip show requests

Name: requests
Version: 2.21.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me&at;kennethreitz.org
License: Apache 2.0
Location: py37\lib\site-packages
Requires: certifi, chardet, idna, urllib3
Required-by:

В метаданных в качестве зависимостей перечислены certifi, chardet, idna и urllib3 и можно видеть, что именно они и были установлены.

Используя установленный пакет requests, можно переписать ранее приведенный и посмотреть насколько легче стало получить содержимое веб-страницы:

# In using-requests.py

import requests

url = 'https://www.google.com'
response = requests.get(url)
print(f'Response returned: {response.status_code}, {response.reason}')
print(response.text)

Можно импортировать пакет requests как любой другой стандартный пакет, поскольку он теперь установлен в вашей среде.

Как можно видеть, requests.get() обрабатывает HTTP‑соединение и возвращает объект с ответом, аналогичный исходному примеру, но с некоторыми улучшениями интерфейса.

Не нужно иметь дело с кодировкой страницы, потому что в большинстве случаев requests справятся с этим. Тем не менее requests имеет гибкий интерфейс для обработки особых случаев с помощью requests.get().

Использование файлов требований

Команда pip install всегда устанавливает последнюю опубликованную версию пакета, но иногда вам может потребоваться установить конкретную версию, которая, как вы знаете, работает с вашим кодом.

Вы хотите создать спецификацию зависимостей и версий, которые вы использовали для разработки и тестирования своего приложения, чтобы не было сюрпризов при использовании приложения в production.

Файлы требований позволяют вам точно указать, какие версии пакетов должны быть установлены. Запуск pip help показывает, что есть команда freeze, которая выводит установленные пакеты в формате требований. Можно использовать эту команду, перенаправляя вывод в файл для генерации файла требований:

$ pip freeze >; requirements.txt
$ cat requirements.txt

certifi==2018.11.29
chardet==3.0.4
idna==2.8
requests==2.21.0
urllib3==1.24.1

Команда freeze выводит все пакеты и их версии в стандартный вывод, поэтому можно перенаправить вывод в файл, который можно использовать для установки точных требований в другой системе. Соглашение заключается в том, чтобы назвать этот файл requirements.txt, но можно дать ему любое другое имя.

Если вы хотите выполнить репликацию среды в другой системе, можно запустить pip install, указав файл требований с помощью ключа -r:

$ pip install -r requirements.txt

Looking in indexes: https://pypi.org/simple
Collecting certifi==2018.11.29 (from -r .\requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/9f/e0/
  accfc1b56b57e9750eba272e24c4dddeac86852c2bebd1236674d7887e8a/
  certifi-2018.11.29-py2.py3-none-any.whl
Collecting chardet==3.0.4 (from -r .\requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/bc/a9/
  01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/
  chardet-3.0.4-py2.py3-none-any.whl
Collecting idna==2.8 (from -r .\requirements.txt (line 3))
  Using cached https://files.pythonhosted.org/packages/14/2c/
  cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/
  idna-2.8-py2.py3-none-any.whl
Collecting requests==2.21.0 (from -r .\requirements.txt (line 4))
  Using cached https://files.pythonhosted.org/packages/7d/e3/
  20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/
  requests-2.21.0-py2.py3-none-any.whl
Collecting urllib3==1.24.1 (from -r .\requirements.txt (line 5))
  Using cached https://files.pythonhosted.org/packages/62/00/
  ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/
  urllib3-1.24.1-py2.py3-none-any.whl
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 
  requests-2.21.0 urllib3-1.24.1

Версии пакетов будут соответствовать тем, которые перечислены в requirements.txt:

$ pip list

Package    Version
---------- ----------
certifi    2018.11.29
chardet    3.0.4
idna       2.8
pip        19.0.1
requests   2.21.0
setuptools 40.6.2
urllib3    1.24.1

Можно отправить файл requirements.txt в систему контроля версий и использовать его для создания точной среды на других компьютерах.

Требования к тонкой настройке

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

Формат файла требований позволяет вам указывать версии зависимостей, используя логические операторы, которые дают вам некоторую гибкость, чтобы гарантировать обновление пакетов, но при этом определять базовые версии пакета.

Откройте файл requirements.txt в своем любимом редакторе и сделайте следующее изменения:

certifi>;=2018.11.29
chardet>;=3.0.4
idna>;=2.8
requests>;=2.21.0
urllib3>;=1.24.1

Можно изменить логический оператор на >; =, чтобы pip указывал точную или более позднюю версию, которая была опубликована. Когда вы устанавливаете новую среду, используя файл Requirments.txt, pip ищет и устанавливает последнюю версию, удовлетворяющую указанным требованиям. Можно сделать обновление пакетов, записанных в файле требований, выполнив команду install с ключом - upgrade:

$ pip install --upgrade -r requirements.txt

Looking in indexes: https://pypi.org/simple
Requirement already up-to-date: certifi==2018.11.29 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 1)) (2018.11.29)
Requirement already up-to-date: chardet==3.0.4 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 2)) (3.0.4)
Requirement already up-to-date: idna==2.8 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 3)) (2.8)
Requirement already up-to-date: requests==2.21.0 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 4)) (2.21.0)
Requirement already up-to-date: urllib3==1.24.1 in \py37\lib\site-packages 
  (from -r .\requirements.txt (line 5)) (1.24.1)

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

В идеальном мире новые версии пакетов будут обратно совместимы и никогда не будут содержать новых ошибок. К сожалению, в реальном мире в новые версии могут быть внесены изменения, которые повредят ваше приложение. Синтаксис файла требований поддерживает дополнительные спецификаторы версий для точной настройки ваших требований.

Допустим, допустим опубликована новая версия 3.0 requests, но она вносит несовместимые изменения, которые нарушают работу вашего приложения. Вы можете изменить файл требований, чтобы предотвратить установку версии 3.0 или выше:

certifi>;=2018.11.29
chardet>;=3.0.4
idna>;=2.8
requests>;=2.21.0, <3.0
urllib3>;=1.24.1

Изменение спецификатора версии для пакета requests гарантирует, что любая версия, большая или равная 3.0, не будет установлена. Документация pip содержит всю информацию о формате файла требований, где можно узнать об этои больше.

Зависимости разработки vs. production

Не все пакеты, которые вы устанавливаете во время разработки, будут необходимы при эксплуатации приложений. В PyPI опубликовано много пакетов, которые являются исключительно нструментами или библиотеками, которые использовались в процессе разработки.

Например, вы, вероятно, захотите провести модульное тестирование своего приложения, для которого нужна среда модульного тестирования. Популярной платформой для модульного тестирования является pytest. Вы хотите установить его в своей среде разработки, но не хотите в своей production‑среде, потому что она там не нужна.

Вы создаете второй файл требований (requests_dev.txt), чтобы перечислить дополнительные инструменты для настройки среды разработки:

# In requirements_dev.txt
pytest>;=4.2.0

Для этого вам нужно использовать pip для установки обоих файлов требований: (requests.txt) и requests_dev.txt). К счастью, pip позволяет вам указать дополнительные параметры в файле требований. Вы можете изменить requests_dev.txt) для подключения требования из рабочего файла requests.txt):

# In requirements_dev.txt
-r requirements.txt
pytest>;=4.2.0

Обратите внимание, что используется точно такой же ключ -r для установки production‑файл requirements.txt. Формат файла требований позволяет указывать дополнительные аргументы прямо в нём.

Фиксация требования для Production

Вы создали файлы требований для Production и разработки, добавили их в систему контроля версий. В файлах используются гибкие спецификаторы версий, чтобы вы могли использовать исправления ошибок, опубликованные вашими зависимостями. Вы также тестируете свое приложение и готовы развернуть его в рабочей среде.

Возможно, вы захотите убедиться, что версии зависимостей, которые вы развертываете в рабочей среде — это те же версии, которые вы использовали в своем конвейере интеграции или процессе сборки, потому что вы знаете, что все тесты пройдены и приложение работает.

Спецификаторы текущей версии не гарантируют, что те же версии будут развернуты в рабочей среде, поэтому вы хотите зафиксировать production‑требования, как вы видели ранее.

Вы создаете чистую виртуальную production‑среду и устанавливаете production‑требования, используя файл requirements.txt. После того как требования установлены, вы можете зафиксировать определенные версии, выгрузив выходные данные в файл requirements_lock.txt, который вы используете в production‑среде. Файл requirements_lock.txt должен содержать точные спецификации версий и может использоваться для репликации среды.

Поиск пакетов для использования

Когда вы станете более опытным Pythonist‑ом, появится набор пакетов, которые вы будете знать наизусть и которые вы будете использовать в большинстве своих приложений. Пакеты requirements.txt и pytest являются хорошими кандидатами на то, чтобы стать полезными инструментами в вашем наборе инструментов Python.

Однако, наступят времена, когда вам нужно будет решить другую проблему и захочется найти другие инструменты или библиотеки. Что может вам помочь?. Как вы видели раньше, pip help показывает, что есть команда search, которая ищет пакеты, опубликованные в PyPI.

Давайте посмотрим, как эта команда нам поможет:

$ pip help search

Usage:
  pip search [options] <query>;

Description:
  Search for PyPI packages whose name or summary contains <query>;.

Search Options:
  -i, --index <url>;           Base URL of Python Package Index 
                              (default https://pypi.org/pypi)

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment 
                              variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be 
                              used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be 
                              used up to 3 times (corresponding to WARNING, 
                              ERROR, and CRITICAL logging levels).
  --log <path>;                Path to a verbose appending log.
  --proxy <proxy>;             Specify a proxy in the form 
                              [user:passwd@]proxy.server:port.
  --retries <retries>;         Maximum number of retries each connection should 
                              attempt (default 5 times).
  --timeout <sec>;             Set the socket timeout (default 15 seconds).
  --exists-action <action>;    Default action when a path already exists: 
                              (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).
  --trusted-host <hostname>;   Mark this host as trusted, even though it does 
                              not have valid or any HTTPS.
  --cert <path>;               Path to alternate CA bundle.
  --client-cert <path>;        Path to SSL client certificate, a single file 
                              containing the private key and the certificate in 
                              PEM format.
  --cache-dir <dir>;           Store the cache data in <dir>;.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine 
                              whether a new version of pip is available for 
                              download. Implied with --no-index.
  --no-color                  Suppress colored output

pip search принимает набор параметров, перечисленных выше и <query>;, запрос, который представляет собой просто строку для поиска и будет соответствовать пакетам и их описаниям.

Допустим, вашему приложению необходим доступ к службе, которая использует для авторизации OAuth2. В идеале, есть библиотека, которая работает с requests или с похожим интерфейсом, который может нам помочь. Давайте поищем его в PyPI, используя pip:

$ pip search requests oauth

requests-oauth (0.4.1)             — Hook for adding Open Authentication 
                                     support to Python-requests HTTP library.
oauth (1.0.1)                      — Library for OAuth version 1.0a.
pmr2.oauth (0.6.1)                 — OAuth PAS Plugin, OAuth 1.0 provider for 
                                     Plone.
oauth-proxy (1.0.5)                — OAuth HTTP proxy
django-oauth (1.1)                 — Support of OAuth in Django.
intuit-oauth (1.2.0)               — Intuit OAuth Client
brubeck-oauth (0.1.11)             — Brubeck OAuth module
guillotina-oauth (2.0.0)           — guillotina oauth support
httpie-oauth (1.0.2)               — OAuth plugin for HTTPie.
paytm-oauth (0.2)                  — Consumer for paytm oauth
plurk-oauth (0.9.2)                — Plurk OAuth API
oauth-flow (1.0.3)                 — Authenticate and make calls to OAuth 1.0, 
                                     OAuth 2.0 services
... Additional Output Omitted

В результате поиска показана довольно обширная коллекция пакетов. Некоторые из них кажутся специфичными для какой-то службы или технологии, например, django-oauth. Другие выглядят многообещающе, например, requests-oauth. К сожалению, кроме краткого описания, информации не так много.

В большинстве случаев вы хотите искать пакеты прямо на веб-сайте PyPI. Здесь, на PyPI, есть поиск по собственному реестру, который позволяет фильтровать результаты по метаданным пакетов, таким как инфраструктура, тема, состояние разработки и т.д.

Поиск с таким же запросом на PyPI в результате дает гораздо больше, но здесь его можно отфильтровать по разным категориям. Например, вы можете понять Intended Audience (Целевая аудитория) и выбрать Developers (Разработчики), поскольку вам нужна библиотека, которая поможет вам в разработке своего приложения. Кроме того, вы, вероятно, хотите, чтобы пакет был стабильным и готовым к production. Вы можете развернуть категорию Development Status (Состояние разработки) и выбрать Production/Stable (Производство/Стабильный):

Результаты поска в PyPi по запросу "Requests OAuth" Результаты поска в PyPi по запросу «Requests OAuth»[/caption]

Можно применять дополнительные фильтры и изменять условия поиска до тех пор, пока не найдете нужный вам пакет.

Результаты предоставляют ссылку на страницу пакета, которая содержит больше информации и, возможно, некоторую документацию. Давайте посмотрим на информацию для requests-oauth2:

Страница пакета в PyPi, полученная по запросу "Requests OAuth 2"
Страница пакета в PyPi, полученная по запросу «Requests OAuth 2»

Страница проекта на GitHub содержит гораздо больше информации, и, кажется, имеет ссылке перейти в репозитарий project repository. Здесь вы получите дополнительную информацию о проекте и примеры использования.

Поиск хранилища исходного кода может быть бесценным ресурсом. Там вы можете найти некоторые подсказки о статусе проекта, посмотрев дату последних коммитов, количество запросов на извлечение, открытых вопросов и т.д.

Другой вариант найти пакет — Google. Популярные библиотеки Python будут отображаться в верхней части поисков Google, где вы сможете найти ссылку на нужный пакет в PyPI или его хранилище исходного кода.

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

Время от времени вам придется удалять пакеты. Вы либо нашли лучшую библиотеку для замены, либо это то, что вам действительно уже не нужно. Удаление пакетов может оказаться немного сложнее, чем вы думаете.

Удаление пакетов

Обратите внимание, что когда вы устанавливали requests, pip одновременно установил и другие зависимые пакеты. Чем больше пакетов вы устанавливаете, тем больше вероятность того, что несколько пакетов зависят от одного и того же пакета. Здесь вам пригодится команда show в pip.

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

$ pip show requests

Name: requests
Version: 2.21.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: 
License: Apache 2.0
Location: c:\users\isaac\projects\virtualenv\py37\lib\site-packages
Requires: urllib3, certifi, chardet, idna
Required-by:

Обратите внимание на два последних поля: Requires и Required-by. Команда show сообщает нам, что для Requires требуются urllib3, certifi, chardet и IDNA. Вы, вероятно, хотите удалить и их. Вы также можете видеть, что Required-by пуст, т.е. они не требуются никаким другим пакетам и удалить их безопасно.

Вы должны выполнить команду show для всех зависимостей requests, чтобы убедиться, что никакие другие библиотеки также не зависят от них. Как только вы поймете архитектуру зависимости удаляемых пакетов, вы можете приступить к удалению с помощью команды uninstall:

$ pip uninstall certifi

Uninstalling certifi-2018.11.29:
  Would remove:
    \py37\lib\site-packages\certifi-2018.11.29.dist-info\*
    \py37\lib\site-packages\certifi\*
Proceed (y/n)? y
  Successfully uninstalled certifi-2018.11.29

Деинсталлятор покажет вам файлы, которые будут удалены, и запросит подтверждение. Если вы проверили его зависимости, знаете, что больше ничего не использует его, т.е. уверены, что хотите удалить пакет, то смело передавайть ключ y. Чтобы отключить печать списка файлов и запрос подтверждения:

$ pip uninstall urllib3 -y

Uninstalling urllib3-1.24.1:
  Successfully uninstalled urllib3-1.24.1

$ pip uninstall chardet -y

Uninstalling chardet-3.0.4:
  Successfully uninstalled chardet-3.0.4

$ pip uninstall idna -y

Uninstalling idna-2.8:
  Successfully uninstalled idna-2.8

$ pip uninstall requests -y

Uninstalling requests-2.21.0:
  Successfully uninstalled requests-2.21.0

За один вызов можно указать все пакеты для удаления: pip uninstall -y urllib3 chardet idna requests.

Вы также можете удалить все пакеты, перечисленные в файле требований, указав параметр -r <файл_приложения>;. Команда запросит подтверждение на удаление каждого отдельного пакета, но это можно отменить, если знаете, что делаете, с помощью ключа -y:

$ pip uninstall -r requirements.txt -y

Uninstalling certifi-2018.11.29:
  Successfully uninstalled certifi-2018.11.29
Uninstalling chardet-3.0.4:
  Successfully uninstalled chardet-3.0.4
Uninstalling idna-2.8:
  Successfully uninstalled idna-2.8
Uninstalling requests-2.21.0:
  Successfully uninstalled requests-2.21.0
Uninstalling urllib3-1.24.1:
  Successfully uninstalled urllib3-1.24.1

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

Альтернатива pip

pip является важным инструментом для всех Pythonist-ов и используется многими приложениями и проектами для управления пакетами. Этот туториал помог вам с основами, но сообщество Python очень активно предоставляет другие инструменты и библиотеки. У pip есть альтернативы, которые пытаются упростить и улучшить управление пакетами.

В этом разделе вы узнаете о других инструментах управления пакетами, доступных для Python.

Conda делает всё

Conda — менеджер пакетов, зависимостей и сред для многих языков, в том числе и Python. Фактически, его происхождение происходит от Anaconda, которая начиналась как пакет данных для Python.

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

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

Настройка Python для машинного обучения в Windows — это отличное введение в Conda, в котором рассматривается управление пакетами и средой. Единственная информация, относящаяся к Windows, касается установки, поэтому она по-прежнему актуальна, если вы используете другую платформу ОС.

Pipenv

Pipenv — это еще один инструмент управления пакетами, который «стремится принести лучшее из всех упаковочных миров» в Python. Он завоевывает большую популярность среди сообщества Python, поскольку объединяет виртуальную среду и управление пакетами в одном инструменте.

Он также устраняет некоторые наиболее распространенные ошибки, с которыми вы столкнетесь при ручном управлении зависимостями через pip, например версии пакетов, разделение зависимостей разработки и производства, фиксация версий для производства.

Pipenv: руководство по новому инструменту упаковки Python — отличное начало для знакомства с Pipenv и его подходом к управлению пакетами. Несмотря на то, что статья помечена как intermediate (промежуточная), автор проделал большую работу, чтобы убедить читателя в доступности и необходимости статья для всех, кто начинает работать с Python.

Poetry

Poetry — это еще одна альтернатива pip, которая набирает обороты. Как и Pipenv, он упрощает управление версиями пакетов и отделяет разработку от производственных зависимостей и работает путем изоляции этих зависимостей в виртуальной среде.

Если вы пришли из JavaScript и npm, то Poetry будет выглядеть очень знакомо. Poetry выходит за рамки управления пакетами, помогая создавать дистрибутивы для приложений и библиотек, развертывать их в PyPI. В
Для помощи вам в How to Publish an Open-Source Python Package to PyPI есть хорошее введение в Poetry, которое будет полезно для начала работы.

Вывод: что такое pip?

Этот урок ответил на вопрос, что такое pip? Вы узнали, что pip — менеджер пакетов для Python, используемый многими проектами для управления зависимостями. Он включен в установщик Python, что делает его необходимым инструментом и знание его необходимо всем Pythonist-ам.

Python предоставляет обширную стандартную библиотеку, подходящую для разработки всевозможных приложений, но активное сообщество Python предоставляет еще больший набор инструментов и библиотек, которые ускоряют разработку приложений Python.

Эти инструменты и библиотеки публикуются в реестр пакетов Python (PyPI), а pip позволяет разработчикам устанавливать их в свои прикладные среды.

В этом уроке вы узнали о том как:

  • установить новые пакеты с использованием pip в командной строке и с файлами требований;
  • управлять зависимостями, разделять требований при разработке и производстве, создавать файла фиксированных требований;
  • искать пакеты через pip и PyPI;
  • узнавать зависимости пакета перед удалением и удалять пакеты с pip.

Кроме того, вы узнали о важности своевременного обновления зависимостей и альтернатив pip, которые могут помочь вам управлять этими зависимостями.

Не стесняйтесь обращаться в разделе комментариев ниже с любыми вопросами, которые у вас могут возникнуть, и вы всегда можете получить дополнительную информацию на pipстранице документации.

По мотивам: What Is Pip? A Guide for New Pythonistas

Опубликовано Вадим В. Костерин

ст. преп. кафедры ЦЭиИТ. Автор более 130 научных и учебно-методических работ. Лауреат ВДНХ (серебряная медаль).

Оставьте комментарий

Ваш адрес email не будет опубликован.