Диагностика7 мин чтения

Missing dependencies for SOCKS support: как исправить

Ошибка Missing dependencies for SOCKS support в Python Requests, pip и HTTPX: установите requests[socks] или уберите переменную ALL_PROXY, которая её вызывает.

На этой странице

Missing dependencies for SOCKS support означает, что Requests получил URL SOCKS-прокси, например socks5:// или socks5h://, и не смог выполнить import socks, то есть импортировать модуль, который устанавливает PySocks, в том Python, который сейчас работает. Requests бросает это исключение до открытия соединения, так что к прокси ещё никто не обращался.

URL прокси не обязан быть в вашем коде: Requests берёт его и из ALL_PROXY или all_proxy в окружении. А pip работает на собственной встроенной копии Requests, поэтому с такой переменной pip install pysocks останавливается с тем же сообщением.

Что вы видитеПричинаРешение
requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support., и ваш код задаёт SOCKS-проксиPySocks не импортируется из этого PythonРешение 1: python -m pip install "requests[socks]"
Та же ошибка, но ваш код прокси не задаётВ ALL_PROXY или другой переменной прокси лежит SOCKS-URLРешение 2: уберите переменную или установите PySocks
ERROR: Could not install packages due to an OSError: Missing dependencies for SOCKS support.pip прочитал ту же переменнуюРешение 3: очистите её для одной этой команды
AttributeError: module 'socks' has no attribute 'PROXY_TYPE_SOCKS5'Вместо PySocks импортируется ваш собственный socks.py или пакет socks/Решение 4: переименуйте его
ImportError: Using SOCKS proxy, but the 'socksio' package is not installed.HTTPX нужен socksio, а не PySockspython -m pip install "httpx[socks]"

Результаты ниже записаны 5 октября 2026 года с Requests 2.34.2, HTTPX 0.28.1, pip 26.2.1, PySocks 1.7.1 и socksio 1.0.0 на Python 3.13.5 и 3.14.4, с новым виртуальным окружением для каждого случая. Обе версии Python дали одинаковые результаты.

Решение 1: установите PySocks в тот Python, который запускает ваш код

sh
python -m pip install "requests[socks]"

Это дополнение (extra) добавляет один пакет, PySocks; его импортируемый модуль называется socks. Установка pysocks по имени тоже работает. Пишите python -m pip, а не просто pip: так пакет ставится в тот интерпретатор, который запускает команда python, а отдельный pip может принадлежать другому окружению. В лаборатории, когда pip в PATH указывал на второе виртуальное окружение, pip install "requests[socks]" напечатал Successfully installed PySocks-1.7.1, а скрипт продолжал падать с той же ошибкой.

Проверьте работающий интерпретатор:

sh
python -c "import socks, sys; print(sys.executable, socks.__file__)"

Команда печатает интерпретатор и файл, в который разрешился import socks; это должен быть socks.py в site-packages этого интерпретатора. ModuleNotFoundError: No module named 'socks' означает, что в этом Python нет PySocks.

Решение 2: вы не задавали прокси

Если не передать proxies, Requests собирает их из окружения. Его документация называет http_proxy, https_proxy, no_proxy и all_proxy, а также варианты в верхнем регистре. Посмотрите, что наследует ваш процесс:

sh
env | grep -i _proxy

В лаборатории скрипт без прокси в коде падал с этой ошибкой, когда была задана только ALL_PROXY=socks5://127.0.0.1:1080, и точно так же только со строчной all_proxy. HTTP_PROXY с URL socks5:// дала то же самое. Issue #3516 в Requests описывает именно этот случай: в окружении автора была all_proxy, и код сломался при обновлении до Requests 2.11, где, по словам мейнтейнера, появилась поддержка all_proxy.

Если SOCKS-прокси вам нужен, примените решение 1. Если нет, уберите переменную там, где она задаётся, например в профиле оболочки или в образе контейнера. Четыре детали из лаборатории:

  • Пустое значение считается отсутствующим. ALL_PROXY= дала прямой запрос и статус 200.
  • Нижний регистр побеждает. Когда all_proxy задана, а ALL_PROXY очищена, ошибка оставалась. Очистка all_proxy убирала её, даже если ALL_PROXY оставалась заданной. Очищайте обе.
  • ALL_PROXY служит запасным вариантом. Когда HTTP_PROXY тоже указывала на HTTP-прокси, запрос к URL http:// обратился к этому прокси и до кода SOCKS не дошёл.
  • Код может отказаться от окружения. session.trust_env = False вернул 200 при заданной ALL_PROXY, и то же дало добавление хоста в NO_PROXY.

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

Решение 3: pip падает с Missing dependencies for SOCKS support

pip скачивает пакеты через встроенную (vendored) копию Requests и читает те же переменные. С all_proxy или ALL_PROXY, указывающей на SOCKS-URL, в новом виртуальном окружении:

code
$ python -m pip install "requests[socks]"
WARNING: There was an error checking the latest version of pip.
ERROR: Could not install packages due to an OSError: Missing dependencies for SOCKS support.

pip download и pip index versions вместо этого заканчивались трассировкой, последняя строка которой: pip._vendor.requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support. Очистите переменные для одной этой команды:

sh
ALL_PROXY= all_proxy= python -m pip install "requests[socks]"

env -u ALL_PROXY -u all_proxy перед командой тоже сработало. Очистка одной только ALL_PROXY не помогла, потому что all_proxy оставалась заданной.

Затем решите, должна ли переменная оставаться экспортированной. С установленным PySocks Requests использовал прокси из ALL_PROXY и вернул 200 через SOCKS-сервер лаборатории. С pip вышло иначе: pip 26.2.1 остановился с TypeError: PoolKey.__new__() got an unexpected keyword argument 'key_proxy_ssl_context', тогда как pip 25.1.1 установил пакет через тот же прокси. С pip 26.2.1 продолжайте очищать переменную для команд pip или задавайте прокси только той программе, которой он нужен.

Решение 4: AttributeError: module 'socks' has no attribute 'PROXY_TYPE_SOCKS5'

Здесь import socks что-то нашёл, но не PySocks. Python сначала ищет в каталоге скрипта, а для python -c и python -m в текущем каталоге, и только в конце добавляет site-packages, поэтому ваш файл или папка с именем socks выигрывает. Проверка из решения 1 показывает, что было импортировано:

В каталоге, где Python ищет первымPySocks установленРезультатПроверка печатает
socks.pyДаAttributeErrorваш socks.py
socks/ с __init__.pyДаAttributeErrorваш socks/__init__.py
socks/ без __init__.pyДаРаботает, статус 200PySocks в site-packages
socks/ без __init__.pyНетAttributeError, а не InvalidSchemaNone

Переименуйте файл или папку. В последней строке обычная папка с именем socks превратила ошибку об отсутствующей зависимости в AttributeError, так что после переименования всё равно нужно решение 1.

HTTPX: Using SOCKS proxy, but the 'socksio' package is not installed

У HTTPX своя зависимость для SOCKS. Без неё HTTPX 0.28.1 бросает:

code
ImportError: Using SOCKS proxy, but the 'socksio' package is not installed. Make sure to install httpx using `pip install httpx[socks]`.
sh
python -m pip install "httpx[socks]"

Эта команда установила socksio 1.0.0, и тот же запрос вернул 200 через прокси. Остальные решения применимы и здесь:

  • Ошибка появляется и с proxy="socks5://..." в коде, и когда в окружении есть только ALL_PROXY или all_proxy. Она возникает при создании клиента: с ALL_PROXY вызов httpx.Client() без аргументов падал ещё до первого запроса.
  • Пустая ALL_PROXY и trust_env=False дали прямой запрос и статус 200.
  • Две библиотеки не взаимозаменяемы. HTTPX, у которого установлен только PySocks, всё равно бросал ImportError, а Requests только с socksio бросал InvalidSchema.

Чтобы проверить импорт, замените socks на socksio в команде из решения 1. В руководстве по асинхронным прокси в HTTPX есть полная настройка клиента.

После успешного импорта: выбирайте socks5:// или socks5h:// осознанно

Другая ошибка на этом этапе уже означает прогресс: с установленным PySocks и без слушателя на порту прокси Requests бросил ConnectionError с Connection refused, а это сетевая проблема.

Следующее решение касается схемы. В Requests socks5:// резолвит имя хоста на вашей машине, а socks5h:// отправляет его прокси; HTTPX отправляет имя хоста в обоих случаях. В статье socks5 и socks5h: что шесть клиентов на самом деле отправляют прокси записаны результаты по каждому клиенту, а HTTP и SOCKS5 прокси поможет, если вы ещё выбираете протокол.

Как это тестировалось

На Ubuntu 26.04.1, всё на 127.0.0.1: python -m http.server в роли цели и небольшой SOCKS5-ретранслятор, который записывает каждый полученный запрос. Каждый из 47 случаев выполнялся на обеих версиях Python в новом виртуальном окружении, в рабочем каталоге без посторонних файлов и с пустым домашним каталогом, без переменных прокси, кроме названных в этом случае. Аккаунт прокси не использовался; единственный исходящий трафик составляли обращения pip к PyPI. Ни в одном случае с ошибкой ретранслятор не записал соединения.

Архив лаборатории содержит скрипт запуска, SOCKS5-ретранслятор, README и записанные результаты.

Не тестировалось: macOS и Windows, SOCKS4 и SOCKS-прокси с аутентификацией, старые версии Requests и HTTPX, а также установщики помимо pip.

ipvolt — прокси-сервис для разработчиков, который пока не открыт; запишитесь в список раннего доступа, и вы получите одно письмо, когда он откроется.

Источники и дополнительное чтение

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