Ответ 1
У меня была та же проблема с conda и запросы 2.11 (я работаю в VM Ubuntu за корпоративным прокси).
export all_proxy="https://<proxy>:<port>/"
и теперь он работает.
Я пытаюсь взаимодействовать с API из моей оболочки Python 2.7, используя пакет, который опирается на запросы Python. Вещь - это удаленный адрес, заблокированный моей сетью (университетская библиотека).
Итак, чтобы поговорить с API, я делаю следующее:
~$ ssh -D 8080 [email protected]
И затем, в новом терминале, на локальном компьютере:
~$ export http_proxy=socks5://127.0.0.1:8080 https_proxy=socks5://127.0.0.1:8080
Затем я запускаю программу в консоли Python, но не удается:
~$ python
>>> import myscript
>>> id = '1213'
>>> token = 'jd87jd9'
>>> connect(id,token)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 518, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 370, in send
conn = self.get_connection(request.url, proxies)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 273, in get_connection
proxy_manager = self.proxy_manager_for(proxy)
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 169, in proxy_manager_for
**proxy_kwargs
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 43, in SOCKSProxyManager
raise InvalidSchema("Missing dependencies for SOCKS support.")
requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support.
Этот отрывок из module.py просит модуль:
> try:
> from .packages.urllib3.contrib.socks import SOCKSProxyManager except ImportError:
> def SOCKSProxyManager(*args, **kwargs):
> raise InvalidSchema("Missing dependencies for SOCKS support.")
Теперь проблема возникает в urllib3 SOCKSProxyManager.
Итак, я читал, что вы можете использовать SOCKSProxyManager с SOCKS5, если у вас установлена PySocks, или вы используете pip install urllib3 [socks]
Увы, я пробовал как PySocks, так и urllib3 с носками без каких-либо успехов.
Любая идея другого обходного пути?
EDIT:
Я также попробовал запросы на установку пакетов [socks] (которые запрашивают поддержку 2.10.0 с поддержкой Socks), и я получаю следующее:
File "/home/username/.virtualenvs/venv/local/lib/python2.7/site-packages/requests/adapters.py", line 467, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: SOCKSHTTPSConnectionPool(host='api-server.com', port=443): Max retries exceeded with url: /auth (Caused by NewConnectionError('<requests.packages.urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x95c7ccc>: Failed to establish a new connection: SOCKS5 proxy server sent invalid data',))
У меня была та же проблема с conda и запросы 2.11 (я работаю в VM Ubuntu за корпоративным прокси).
export all_proxy="https://<proxy>:<port>/"
и теперь он работает.
Это означает, что запросы используют носки в качестве прокси-сервера и что носки не установлены.
Просто запустите
pip install pysocks
Я добавил requests[socks]>=2.10.0
в свой файл требований .txt, обновил переменную https_proxy
env и наткнулся на указанную выше ошибку. Затем я попробовал обычный pip install requests[socks]
после сброса переменной https_proxy
env и PySocks
. Я не уверен, почему pip install -Ur requirements.txt
не удалось установить PySocks в первый раз.
После этого я смог сделать запрос в python, используя прокси-сервер socks.
Похоже, ваш сервер socks не ведет себя. Я бы посмотрел, могли ли вы или ваш администратор посмотреть журналы и посмотреть, о чем жалуется машина.
В Ubuntu вы можете запустить:
unset all_proxy && unset ALL_PROXY
Я также наткнулся на эту проблему, выполняя простой pip install -U pip
, но информация, которую я нашел из вашего вопроса, помогла мне решить мою проблему. Я нахожусь на Mac OS X.
Как вы указали, adapters.py из пакета requests
пытался это сделать:
try:
from .packages.urllib3.contrib.socks import SOCKSProxyManager
except ImportError:
def SOCKSProxyManager(*args, **kwargs):
raise InvalidSchema("Missing dependencies for SOCKS support.")
Поэтому представляется разумным поискать место определения SOCKSProxyManager. Похоже, что он находится в модуле "contrib" в urllib3 и по умолчанию не установлен рядом с urllib3. Строка документа этого модуля говорит:
This module contains provisional support for SOCKS proxies from within
urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and
SOCKS5. To enable its functionality, either install PySocks or install this
module with the ''socks'' extra.
В инструкциях pip docs говорится о дополнительных возможностях setuptools:
6. Install a package with setuptools extras.
$ pip install SomePackage[PDF]
$ pip install git+https://git.repo/some_pkg.git#egg=SomePackage[PDF]
$ pip install SomePackage[PDF]==3.0
$ pip install -e .[PDF]==3.0 # editable project in current directory
Поэтому я следовал инструкциям и сделал:
$ pip install 'urllib3[socks]'
Затем я продолжил pip install -U pip
, что я и должен был делать, и теперь это работает.
Интересно, сколько людей были обмануты квадратными скобками, так как Bash и другие оболочки часто воспринимают его как специальный символ, который нужно экранировать, чтобы он достиг вызывающей программы (в данном случае pip).
Я получил ту же ошибку всего несколько минут назад. Затем переустановил запрос [носки] через pip. Кажется, что отсутствовала часть носков, которая win-inet_pton. Pip установил его, и проблема решена.
Просто отключите переменную окружения all_proxy
, и это должно сработать. Также вы можете обратиться к этому issue в github.
В Ubuntu вы можете использовать следующую команду unset all_proxy
и перезапустить терминал
Моя среда - Ubuntu 16.4 LTS и Python3.5.2
Я использую pip3 для установки libs, получил ту же проблему. поэтому я использую команду unset ALL_PROXY
для решения этой проблемы, и она работает.
PS:
используйте printenv | grep -i proxy
, чтобы показать информацию прокси.
В Ubuntu я делаю следующие команды:
# Unset socks proxy
unset all_proxy
unset ALL_PROXY
# Install missing dependencies:
pip install pysocks
# Reset proxy
source ~/.bashrc