Существуют разные ситуации применения прокси-серверов, но чаще всего прокси требуются в IT-проектах, особенно при написании своих парсеров и при создании комплексных web-приложений или сервисов. В данном материале мы расскажем о том, как использовать прокси с pip. Можно ли настроить прокси для конкретных коннектов или на уровне глобальных переменных среды и как это сделать (с предметными инструкциями). А ещё приведём список наиболее распространённых ошибок и методы диагностики проблем работы pip через прокси.
Введение в pip и использование прокси-сервера
Если максимально кратко, то pip — это штатный менеджер пакетов в среде программирования Python. У него есть альтернативы: conda (для окружения Anaconda), poetry, pipenv (объединяет виртуальное окружение virtualenv и менеджер pip), buildout (ранее был популярен для работы с масштабными проектами на Python).
Технически pip решает следующие задачи:
- Скачивает и устанавливает новые пакеты (в норме — из открытого репозитория PyPI/ Python Package Index, официальный сайт).
- Обновляет уже установленные пакеты (только по команде пользователя).
- Следит за имеющимися зависимостями (может автоматически доустанавливать дополнительные рекомендуемые пакеты, связанные с основным).
- Обеспечивает удобное удаление ненужных пакетов и зависимостей.
Прокси-серверы — это узлы-посредники. Они нужны для разных задач:
- Для перенаправления трафика и балансировки нагрузки.
- Для обхода сбойных узлов и для выстраивания более эффективных маршрутов в Сети.
- Для распараллеливания запросов и организации тестирования (безопасности, производительности и т.п.).
- Для решения вспомогательных задач по работе с контентом — сжатие данных, очистка от ненужного содержимого, организация внутренних корпоративных сетей и хранилищ, и т.п.
Если максимально кратко, то прокси — это средство для организации альтернативных маршрутов в Интернете и управления потоками данных.
Прокси бывают разных типов и видов: прозрачные и анонимные, с ротацией (backconnect-схема) и без, HTTP/HTTPS, SOCKS, SSH и т.п. (по поддерживаемым протоколам), резидентные, мобильные и серверные (по типу выходных адресов), кеширующие, со сжатием и т.п. У каждого типа прокси своя сфера применения и особенности подключения.
Например, для работы в паре с парсерами логичнее всего использовать ротируемые HTTP или SOCKS-прокси на базе мобильных или домашних IP (резидентные прокси). Для корпоративных задач по управлению трафиком могут подойти серверные прокси.
Что такое pip и зачем его использовать с прокси-сервером?
Осталось объяснить как связаны между собой менеджер пакетов Python и прокси. Выше мы упомянули, что pip скачивает библиотеки и код из репозитория PyPI. Но такой подход может быть неудобен в ряде случаев, например, когда:
- Компания использует собственное проверенное хранилище кода. Скрипты здесь могут быть переделаны под себя или вообще написаны с нуля (без общего доступа для всего остального мира).
- Разработка ведётся в локации, из которой официальное хранилище кода недоступно. Например, доступ к сайту PyPI блокируется корпоративными политиками или системами защиты (антивирусы, брандмауэры и т.п.).
И чтобы перенаправить трафик в нужную точку, нужны прокси. К слову, прокси-сервер здесь может выполнять ряд дополнительных задач, например, кеширование статического контента (в том числе файлов с Python-скриптами), проверка на вирусы и опасный контент, сжатие (для экономии трафика и ускорения скачивания).
Итого, обходится сразу несколько проблем: повышается безопасность, облегчается контроль трафика и запросов, открывается доступ к управлению содержимым.
Типичные сценарии, в которых требуется работа pip через прокси
- Организация централизованного хранилища кода и библиотек в корпоративной среде. Прокси здесь будут выполнять роль единой точки входа в это хранилище (в обход стандартного общедоступного хранилища PyPI).
- Организация фильтрации небезопасного контента и скриптов. Будет полезным, например, при использовании в школах, ВУЗах и других учебных учреждениях. Прокси сможет фильтровать вирусы и иной вредоносный код на входе.
- Обход региональных или локальных блокировок, которые ограничивают прямой доступ к хранилищу PyPI. Например, когда в корпоративной сети блокируются определённые сайты или протоколы.
- Журналирование доступа к PyPI для текущего проекта — для лучшего контроля и понимания узких мест.
Как использовать pip с прокси-сервером (краткое руководство)
Менеджер пакетов pip может подключаться к прокси разными способами: посредством специального синтаксиса команд, с задействованием переменных окружения или виртуальных сред, а также с использованием конфигурационных файлов.
Ниже рассмотрим каждый из вариантов подключения прокси к pip в подробностях.
Синтаксис установки прокси для pip одной строкой
Стандартный синтаксис pip выглядит следующим образом:
pip install <название пакета>
Если вы не добавляли pip в переменные окружения, то нужно обратиться напрямую к исполняемому файлу. Например, в Windows это будет выглядеть примерно так:
cd "C:\Program Files\Python313\Scripts\"
./pip.exe install <название пакета>
Путь установки pip может отличаться. В нашем случае установка осуществлялась в общий для всех каталог «Program Files», а версия Python — 3.13.
Если вызов Python добавлен в переменные среды, а pip нет, то команда может выглядеть так:
python -m pip install <название пакета>
Вместо команды «install» могут быть и другие: download (только для загрузки указанного пакета), uninstall (для удаление пакетов), freeze (для «заморозки» пакетов), list (для получения списков уже установленных пакетов), search (для поиска пакетов) и т.д.
Обратите внимание: для апдейта нет отдельной команды, но есть флаг параметра «install»:
pip install --upgrade <название пакета>
Прокси тоже определяются на уровне специального флага к команде pip install (--proxy). Полная команда будет выглядеть так:
pip install --proxy http://123.455.234.345:3088 <имя пакета>
Данные коннекта нужно заменить на свои (IP-адрес и номер порта).
Если обращение к прокси осуществляется на основе домена, то строка подключения pip к прокси будет выглядеть так:
pip install --proxy http://proxy-url.com:3088 <имя пакета>
Как использовать pip с прокси-сервером, требующим аутентификации
Многие ротируемые прокси требуют обязательной авторизации за защиты подключений. Подключение прокси к pip в этом случае будет выглядеть так:
pip install --proxy http://proxy_user:PASSWRD@123.455.234.345:3088 <имя пакета>
Можно заметить, что конструкция поменялась не сильно. Добавились только параметры аутентификации.
Естественно, вместо указанных нами значений нужно подставить актуальные данные (те, что вам предоставил ваш прокси-сервис).
Резидентные прокси
Лучшие прокси-серверы для доступа к ценным данным со всего мира.
Постоянная настройка прокси-сервера в pip
Если вы не хотите каждый раз прописывать параметры прокси на уровне синтаксиса pip, можно попробовать указать условия подключения в конфигурационных файлах скрипта или добавить их в переменные среды.
Сейчас расскажем о каждом подходе по-отдельности.
Настройка pip.conf (Linux/macOS) или pip.ini (Windows)
Утилита pip может иметь свои конфигурационные файлы. И они не всегда хранятся централизованно. Чтобы не писать свои конфиги вслепую, лучше всего узнать у pip, где конкретно он ищет информацию.
Для этого введите команду:
pip config -v list
В Windows файлы будут подхватываться из каталогов:
- Глобально (вариант 'global') — 'C:\ProgramData\pip\pip.ini'
- Локально (для конкретного пользователя) — 'C:\Users\<ВАШ_ЛОГИН>\pip\pip.ini'
- Ещё локальный вариант (тоже для конкретного пользователя) — 'C:\Users\<ВАШ_ЛОГИН>\AppData\Roaming\pip\pip.ini'
- Для web-парсинга (вариант 'site') — 'C:\Program Files\Python313\pip.ini'
Конкретно в вашем случае путь установки Python может отличаться, поэтому путь «C:\Program Files\Python313» будет другим.
Открывайте нужный вам файл и добавляйте в него строки:
[global]
proxy = http://proxy_user:PASSWRD@123.455.234.345:3088
(с вашими актуальными данными подключения)
Если файла не существует, просто создайте его: правой кнопкой мыши в папке, пункт «Создать», в выпадающем меню «Текстовый документ». После создания переименуйте его и смените расширение. Должно получиться «pip.ini».
В Linux или в MacOS файлы конфигурации будут иметь расширение .conf, а располагаться будут в других каталогах.
Для Linux-дистрибутивов (в большинстве случаев):
- Глобальный уровень — ‘/etc/pip.conf’. Если в ОС используется переменная среды XDG_CONFIG_DIRS, то актуальная версия каталога с конфигами pip будет определяться настройками переменной (например, «/etc/xdg/pip/pip.conf»).
- Уровень пользователя — ‘~/.config/pip/pip.conf’ (обратите внимание, с точки начинаются названия скрытых папок и файлов, а «~» — это каталог пользователя).
- Уровень сайтов — ‘$VIRTUAL_ENV/pip.conf’ (то есть прописывается на уровне виртуального окружения).
Для MacOS:
- Глобальный уровень — ‘/Library/Application Support/pip/pip.conf’.
- Уровень пользователя — в новых версиях ОС ‘$HOME/Library/Application Support/pip/pip.conf’, но поддерживается и подгрузка устаревшего формата, по аналогии с Linux ‘$HOME/.config/pip/pip.conf’.
- Уровень сайтов — ‘$VIRTUAL_ENV/pip.conf’ (конфиг-файл виртуального окружения).
Наибольший приоритет отдаётся записям, которые определяются на самом последнем уровне:
- Первый — глобальный.
- Второй — уровень пользователя (переопределяет повторяющиеся конфиги глобального).
- Третий — уровень окружения (переопределяет повторяющиеся конфиги пользователя).
- Последний — командная строка (переопределяет переменные виртуального окружения).
Настройка прокси-сервера pip с помощью переменных среды
В Windows переменные можно задать через специальный интерфейс. Вбейте в поиске системы «Environment variables» или откройте свойства системы и кликните на кнопке «Переменные среды».
Создайте новые переменные:
- Имя: HTTP_PROXY
- Значение: http://proxy_user:PASSWRD@123.455.234.345:3088
Если прокси без авторизации, то формат записи будет примерно таким:
http://123.455.234.345:3088 или http://proxy-domain.com:3008
Номер порта, адрес, логин и пароль нужно указать актуальные (у нас несуществующие значения, они используются только для примера).
- Имя: HTTPS_PROXY
- Значение: https://proxy_user:PASSWRD@123.455.234.345:3088
Обратите внимание: HTTP_PROXY и HTTPS_PROXY — это две разные переменные, и определять их нужно обе.
Через переменные среды вы создаёте общие прокси для Python (для всей среды выполнения скриптов).
Вместо графического режима можно задействовать командную строку.
Для Windows
set HTTP_PROXY=http://proxy_user:PASSWRD@123.455.234.345:3088
set HTTPS_PROXY=https://proxy_user:PASSWRD@123.455.234.345:3088
Для Linux
export http_proxy=http://proxy_user:PASSWRD@123.455.234.345:3088
export https_proxy=https://proxy_user:PASSWRD@123.455.234.345:3088
Если вы хотите задать список исключений, то сайты, для которых не нужно включать прокси, следует перечислить в переменной no_proxy. Например:
set NO_PROXY=example.com,site123.org,127.0.0.1
Удаление происходит командой unset (в Linux):
unset HTTP_PROXY
В Windows проще установить «пустой» прокси:
set HTTP_PROXY=
Или можно выполнить общий сброс прокси с правами администратора:
netsh winhttp reset proxy
Pip и прокси через команду «config»
Относительно недавно Python представил CLI-интерфейс для управления настройками менеджера PIP.
Вы можете определять глобальные и пользовательские настройки, а также настройки виртуального окружения напрямую из командной строки. Синтаксис не привязывается к платформе.
Вот будет выглядеть команда для установки прокси на глобальном уровне:
pip config set global.proxy http://proxy.host:1234
или
pip config set global.proxy http://login:pass@proxy.host:1234
(если используется авторизация с логином и паролем)
Вот так определяются настройки на уровне пользователя:
pip config set user.proxy http://login:pass@proxy.host:1234
А вот так для уровня «site» (переменные окружения):
pip config set site.proxy http://login:pass@proxy.host:1234
Pip и прокси в виртуальных средах и инструментах
Переменную среды можно установить или изменить внутри Python-скриптов следующим образом:
PIP_PROXY = http://login:pass@proxy.host:1234
Это будет полный аналог команды «pip --proxy http://login:pass@proxy.host:1234».
Не забудьте указать актуальные значения для подключения к своему прокси.
Если вам нужно установить пакет через pip с прокси только для конкретного виртуального окружения, можно использовать такой синтаксис:
C:\Users\<YOUR_NAME>\myvenv\Scripts\pip install --proxy=http://proxy-user:passwd@proxy_address:1234 virtualenv
То есть вам нужно обратиться напрямую к установщику pip, который лежит в созданном вами виртуальном окружении.
Если прямой путь не срабатывает, сначала перейдите в нужный каталог окружения:
cd “C:\Users\<YOUR_NAME>\myvenv\Scripts\pip”
./pip.exe install --proxy=http://proxy-user:passwd@proxy_address:1234 <имя пакета>
Плюс всегда можно настроить общие переменные для текущего виртуального окружения. Это делается через переменные HTTP_PROXY и HTTPS_PROXY (разбирали их выше):
- В Linux — «export http_proxy=http://proxyserver:port» и «export https_proxy=https://proxyserver:port».
- В Windows — «set http_proxy=http://proxyserver:port» и «set https_proxy=https://proxyserver:port».
Устранение неполадок pip прокси
Одни из самых сложных ошибок настройки: прокси прописаны в разных конфигах, для разных пользователей и на разном уровне доступа (глобально, для переменных сред и т.п.). Найти что и где задано бывает достаточно трудно.
В крупных корпоративных сетях вообще может задействоваться механизм централизованной настройки прокси с NTLM-аутентификацией (он же используется в прокси-серверах NTLMAPS и CNTLM).
Неправильные конфиги легко лечатся прямым прописанием параметров прокси при вызове pip из командной строки. Они имеют наивысший приоритет.
Но мало определить только адрес и порт прокси. Ошибки могут возникать и из-за других опций конфигурации.
Распространенные ошибки: таймауты, SSL, сбои аутентификации
Репозиторий PyPI недоступен
Редко, но вполне реалистично. Чтобы убедиться в его работоспособности, подключитесь к нему напрямую (без прокси) или через другой (заведомо работоспособный) прокси.
Коннект pip через прокси выдаёт ошибку таймаута
Как минимум нужно проверить, что прокси доступен и работает (+вы могли ошибиться при вводе логина/пароля). Это можно сделать с помощью утилит curl или wget из консоли (рассмотрим ниже).
А ещё следует переопределить опцию стандартного таймаута (на случай, если он уже установлен в каком-то из конфигов слишком коротким, системная предустановка — 15 секунд):
pip install --proxy http://123.455.234.345:3088 --timeout=60 <имя пакета>
В нашем примере мы установили тайм-аут в 60 секунд.
Ошибка авторизации (407 ошибка)
Если прокси доступен, но ошибку выдаёт только при обращении из вашего python-скрипта, то с большой вероятностью проблема кроется в наличии спецсимволов в имени пользователя или в пароле.
Спецсимволы нужно перекодировать. Например:
- @ — %40
- : — %3A
- # — %23
Ошибка верификации (небезопасные SSL-сертификаты)
Самый правильный подход — добавить сертификаты безопасности (через опцию --cert=/путь/до/сертификата/cert.pem). Ошибка обычно возникает, если вы обращаетесь к стороннему индексу пакетов, а при авторизации задействуется дефолтный SSL (для pypi.org). Естественно, сертификат будет отображаться как невалидный. Чтобы убрать ошибку, вам нужно скачать и установить SSL для выбранного индекса пакетов.
Но если у вас нет SSL в наличии, то и добавить ничего вы не сможете.
«Костыльное» решение — объявить адрес хоста, который приводит к появлению ошибки, доверенным. За это отвечает флаг --trusted-host:
pip install --trusted-host your-index.org --proxy http://123.455.234.345:3088 <имя пакета>
Диагностика с помощью подробного вывода и curl/wget
Самый простой вариант — обратиться к сайту через утилиту curl и вывести все предупреждения и информацию в консоль:
curl -I https://pypi.org --proxy http://proxy-user:passwd@proxyserver.com:3038
В Windows утилиту, возможно, придётся скачать и установить вручную (официальный сайт curl). Выполнение скрипта будет немного сложнее. Сначала нужно распаковать программу в каталог, а затем переключиться в него:
cd "C:\путь\до\curl\bin\"
curl.exe -I https://pypi.org --proxy http://proxy-user:passwd@proxyserver.com:3038
WGET нет в Windows, поэтому его придётся качать и устанавливать отдельно.
Синтаксис для обращения к сайтам через прокси выглядит следующим образом:
wget https://pypi.org -e use_proxy=yes -e http_proxy=proxy-user:passwd@proxyserver.com:3038
Либо прокси нужно определять на уровне переменных среды (смотри выше) и обращаться к сайтам без дополнительных опций:
wget https://pypi.org
Стандартная отладка менеджера пакетов pip настраивается через параметр -v. Чем больше «v», тем выше детализация лога:
- Подробный вывод — «pip install -v--proxy http://123.455.234.345:3088 <имя пакета>»
- Ещё подробнее — «pip install -vv--proxy http://123.455.234.345:3088 <имя пакета>»
- Максимум деталей — «pip install -vvv--proxy http://123.455.234.345:3088 <имя пакета>»
Мобильные прокси
Мобильные IP-адреса обеспечивают максимальную гибкость и бесперебойную связь.
Дополнительные советы по pip прокси
Параметры подключения к прокси, в особенности логин и пароль, вполне можно отнести к конфиденциальной информации. В связи с этим, хранение данных о pip прокси вместе с кодом скриптов нельзя назвать безопасным. Одно дело, когда код пишет и обслуживает всего один разработчик (например, если это фан-проект или индивидуальная разработка для собственных нужд), а другое — большой коллектив и разрозненные скрипты.
В связи с этим мы рекомендуем определять данные подключения к прокси на уровне переменных среды или на уровне конфигов (ini/config файлы).
Но тогда возникает другая проблема: чем больше прокси у вас будет использоваться в проекте, тем сложнее ими будет управлять.
Тут есть элегантное, но платное решение — прокси-сервис с ротируемыми адресами. Вам достаточно создать отдельный прокси-фильтр (или порт), выдать данные для подключения к нему сотруднику, и в дальнейшем управлять параметрами выбора выходных адресов через удобный личный кабинет. Ненужные фильтры или порты легко отключаются и удаляются, например, если сотрудник уволен или прокси для данного сервиса больше не требуется.
Выводы и рекомендации
Pip — мощное встроенное решение для управления Python-библиотеками. Этот менеджер пакетов из коробки умеет работать через прокси, что добавляет ему гибкости и функциональности.
Подключение pip к прокси можно выполнить с помощью специального синтаксиса команд в консоли, а также с задействованием переменных среды и конфигурационных файлов. Специально для pip предоставляется консольная утилита настройки — pip config.
Но мало настроить pip, нужны ещё качественные прокси. Вы можете подобрать надёжные ротируемые резидентные, мобильные и серверные прокси у нас. Froxy — это 10+ млн. IP из 200+ стран с таргетингом до города и оператора связи. Расчёт на основе потребляемого трафика.