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, а не PySocks | python -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, который запускает ваш код
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, а скрипт продолжал падать с той же ошибкой.
Проверьте работающий интерпретатор:
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, а также варианты в верхнем регистре. Посмотрите, что наследует ваш процесс:
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-прокси, запрос к URLhttp://обратился к этому прокси и до кода 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, в новом виртуальном окружении:
$ 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. Очистите переменные для одной этой команды:
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 | Да | Работает, статус 200 | PySocks в site-packages |
socks/ без __init__.py | Нет | AttributeError, а не InvalidSchema | None |
Переименуйте файл или папку. В последней строке обычная папка с именем socks превратила ошибку об отсутствующей зависимости в AttributeError, так что после переименования всё равно нужно решение 1.
HTTPX: Using SOCKS proxy, but the 'socksio' package is not installed
У HTTPX своя зависимость для SOCKS. Без неё HTTPX 0.28.1 бросает:
ImportError: Using SOCKS proxy, but the 'socksio' package is not installed. Make sure to install httpx using `pip install httpx[socks]`.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 — прокси-сервис для разработчиков, который пока не открыт; запишитесь в список раннего доступа, и вы получите одно письмо, когда он откроется.
Источники и дополнительное чтение
Технические материалы, использованные при подготовке руководства. Сверяйтесь с документацией вашей версии и с поддерживаемой конфигурацией вашего провайдера.