python - 尝试使用 Python 3.7.2 pip 安装包会导致 TSL/SSL 错误

标签 python python-3.x pip python-3.7

我正在运行:

Amazon Linux AMI 2018.03.0

Linux ip-xxx-yy-z-ww 4.14.77-70.59.amzn1.x86_64 #1 SMP Mon Nov 12 22:02:45 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

多python环境。它同时安装了 Python 2.7.15 和 3.7.2。

常规 (Python2) pip 工作顺利。

当我尝试运行 pip3 install flask 时,出现以下错误:

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting flask
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Could not fetch URL https://pypi.org/simple/flask/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/flask/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement flask (from versions: )
No matching distribution found for flask
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

如果我尝试安装任何其他软件包,也会出现同样的错误。

pip3版本为18.1

添加 --trusted-host pypi.org 没有帮助。

安装 ca 证书没有帮助

根据以下指南安装 Python 3:https://stackoverflow.com/a/8112006/8826349

编辑: 我现在注意到,在 Python 3 上运行 make 时,它成功完成,但有以下消息:

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_hashlib              _ssl                  _tkinter
_uuid
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  atexit                pwd
time


Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

编辑2:

我的问题似乎与 this 相同.但是,除了描述问题之外,线程没有提供任何解决方案。

我尝试使用 this 编译更新版本的 openssl指导。但是更新的 openssl 版本没有解决我的问题。

编辑3:

我找不到解决此问题的方法。

Amazon 的 Linux 版本似乎不能很好地与 Python 3 配合使用。

他们确实有一个不同的操作系统,称为 Amazon Linux 2,在其中安装 Python 3 就像运行 yum install python3 一样简单

但是,Amazon Linux 2 有其自身的问题。这是 Python 2 安装缺少 pip。您可以通过运行手动安装它:

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

但这实际上覆盖了 pip3,因此 Python 3 仍然没有 pip

最佳答案

因此,SSLError("Can't connect to HTTPS URL because the SSL module is not available.") 在此上下文中表示当您从源代码编译 python3.7 时,它没有链接到您的系统 OpenSSL 库。迂腐的解决方案是确保除了 lib 之外还有所需的 header ,例如:
$ yum install openssl-devel.x86_64 openssl.x86_64
并从头开始重新编译,链接到 OpenSSL 库。

但是,正如您正确指出的那样,在 EC2 中使用 yum(来自 Amazon 自己的存储库,针对 Amazon Linux 测试的软件包)安装 python3 是一种更简单、更可靠的方法,并且将解决所有依赖关系。例如,类似这样的东西将在 Amazon Linux(版本 1)中运行:

$ yum install python36.x86_64
$ yum install python36-pip.noarch

EC2中通常已经预装了Python3.6,但没有预装python36-pip...

这是正确的默认行为,Python3 的 pip 脚本由 pip3 命令调用,而 pip 用于 Python2(如果安装 - python2 的 yum 包是 python27- pip.noarch),例如:

$ pip3 -V  
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)  
$ pip2 -V  
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)  
$ pip -V  
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)  

还有版本化的 Python 命令可与 -m 开关(用于模块)结合使用以运行相应版本的 pip,例如:
$ python3 -m pip install --user flask

您通过 get-pip.py --user 安装的那个可能已经落在您的 $HOME/.local/bin 目录中的某个地方。 --user 开关仅为当前用户(在 ~/.local/lib/中)而不是整个系统安装包,这实际上是避免干扰系统 python 包的好习惯.

更好的是,您可以在 virtualenv 或 venv 隔离环境中使用 pip:有 python36-virtualenv(可通过 yum 安装),默认的“venv”模块内置于 Python3 并且随时可用(python3 - m venv yournewenvname).创建并激活隔离的 python 环境(一个目录)后,无论 python 版本如何,您都可以在那里做一个简单的 pip install flask。祝你好运!

关于python - 尝试使用 Python 3.7.2 pip 安装包会导致 TSL/SSL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310843/

相关文章:

python - DigitalOcean 中的 Pyopenssl 加密构建轮失败意味着什么?

python - NumPy 具有重叠切片的就地运算

python - 编写 Python 脚本以实时显示兆位/秒

python - 将字符串中的字符串和整数与常量整数进行比较的算法

python - Pygame 不响应变量更新

python - 无法安装Pyaudio

python - 二月 Dateutil 的解析器不解析

python - 更改 Gtk.Button 标签的样式/字体

python - 在运行 Yosemite 的 Mac 上完成 PyMySQL 的安装

github - 从私有(private) github repo pip 安装轮