Вопрос-Ответ

Not able to install Python packages [SSL: TLSV1_ALERT_PROTOCOL_VERSION]

Не удается установить пакеты Python [SSL: TLSV1_ALERT_PROTOCOL_VERSION]

Я пытаюсь установить библиотеку Python с помощью pip, получаю ошибку SSL:

~/projects/base  pre-master±  pip install xdict

Collecting xdict
Could not fetch URL https://pypi.python.org/simple/xdict/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping
Could not find a version that satisfies the requirement xdict (from versions: )
No matching distribution found for xdict

версия pip: pip 9.0.1

Как мне исправить эту ошибку?

Переведено автоматически
Ответ 1

Обновите pip следующим образом:

curl https://bootstrap.pypa.io/get-pip.py | python

Примечание: Возможно, вам потребуется использовать sudo python выше, если не в виртуальной среде.

(Обратите внимание, что обновление pip с помощью pip i.e pip install --upgrade pip также не приведет к его правильному обновлению. Это просто проблема с курицей и яйцом. pip не будет работать, если не использовать TLS >= 1.2.)

Как упоминалось в этом подробном ответе, это связано с недавним отказом от использования TLS для pip. Python.org сайты прекратили поддержку TLS версий 1.0 и 1.1.

Со страницы состояния Python:


Завершено - переходящие отключения завершены, а TLSv1.0 и TLSv1.1 отключены. 11 апреля, 15:37 UTC




Для пользователей PyCharm (virtualenv):


  1. Запустите виртуальную среду с помощью оболочки. (замените "./venv / bin / activate" на свой собственный путь)


    source ./venv/bin/activate

  2. Запустить обновление


    curl https://bootstrap.pypa.io/get-pip.py | python

  3. Перезапустите экземпляр PyCharm и проверьте свой интерпретатор Python в настройках.


Ответ 2

Но если curl сама команда завершается ошибкой или "версия протокола оповещения tlsv1" сохраняется даже после обновления pip, это означает, что базовая версия библиотеки OpenSSL вашей операционной системы<1.0.1 или версия Python <2.7.9 (или <3.4 в Python 3) не поддерживают более новый протокол TLS 1.2, который pip должен подключаться к PyPI с около года назад. Вы можете легко проверить это в интерпретаторе Python:

>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 0.9.8o 01 Jun 2010'
>>> ssl.PROTOCOL_TLSv1_2
AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'

AttributeError (вместо ожидаемого '5') означает, что ваш модуль Python stdlib ssl, скомпилированный со старой библиотекой openssl, не поддерживает протокол TLSv1.2 (даже если библиотека openssl может быть обновлена позже).

К счастью, это можно решить без обновления Python (и всей системы), вручную установив дополнительные пакеты Python - подробное пошаговое руководство доступно здесь, на Stackoverflow.


Обратите внимание, curl и pip и wget все зависят от одной и той же библиотеки OpenSSL для установления SSL-соединений (используйте $ openssl version команду). libcurl поддерживает TLS 1.2 начиная с версии curl 7.34, но более старые версии curl должны иметь возможность подключения, если у вас OpenSSL версии 1.0.2 (или более поздней).




P.S.
Для Python 3, пожалуйста, используйте python3 и pip3 везде (если вы не находитесь в venv / virtualenv), включая curl команду из выше:

$ curl https://bootstrap.pypa.io/get-pip.py | python3 --user


Ответ 3

После ответа @ Anupam в OS X у меня возникла следующая ошибка, независимо от разрешений, с которыми я ее запускал:


Не удалось установить пакеты из-за ошибки среды: [Ошибка 13] В разрешении отказано: ...


В конечном итоге сработало загрузить более новый пакет pip (9.0.3) из PyPI прямо из моего браузера - https://pypi.org/simple/pip /, извлечь содержимое, а затем локально установить пакет pip:

pip install ./pip-9.0.3/

Это исправило мои [SSL: TLSV1_ALERT_PROTOCOL_VERSION] ошибки.

Ответ 4

Решение @Anupam сработало для меня. Однако мне пришлось использовать sudo и указать точное местоположение моей виртуальной среды Python:

curl https://bootstrap.pypa.io/get-pip.py | sudo /Users/{your user name}/{path to python}/bin/python
python python-2.7 pip