由于SSL模块不可用,使用Python3.6在虚拟环境中安装pip3失败

44

(py36venv) vagrant@pvagrant-dev-vm:/vagrant/venvs$ pip3 install pep8

pip被配置为需要TLS/SSL的位置,但是Python中的ssl模块不可用。

正在收集pep8 无法获取URLhttps://pypi.python.org/simple/pep8/:出现了一个问题确认ssl证书:由于SSL模块不可用,因此无法连接到HTTPS URL。 - 跳过

找不到版本满足要求pep8(来自版本:)找不到符合要求的分发

背景信息 - 尝试转移到python 3.6。

使用以下命令安装python3.6:

wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz

tar -xvf Python-3.6.0.tgz

cd Python-3.6.0
./configure --enable-optimizations
make -j8 sudo make altinstall python3.6

通过以下方式创建虚拟环境:

python3.6 -m venv py36venv

source py36venv/bin/activate

尝试安装pep8:

(py36venv) pip3 install pep8

pip被配置为需要TLS/SSL的位置,但是Python中的ssl模块不可用。 正在收集pep8

无法获取URL https://pypi.python.org/simple/pep8/ :证书有问题:无法连接到HTTPS URL,因为SSL模块不可用。 - 跳过 无法找到满足要求的版本pep8(来自版本:)。未找到匹配的发行版。


1
你是否安装了 libssl-dev,Makefile是否指向正确的 SSL,并且在 Makefile 中启用了它?另请参阅:https://dev59.com/0G025IYBdhLWcg3wjGtO - jmunsch
取消以下代码的注释 - **SSL=/usr/local/ssl _ssl _ssl.c
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl
-L$(SSL)/lib -lssl -lcrypto **
- Py_minion
2
如果你找到了解决方案,可以自己回答你的问题。 - jmunsch
6个回答

58

我按照以下步骤在Ubuntu 14.04中安装Python3.6,虚拟环境pip安装正常。

Python 3.6的安装:

sudo apt-get install python3-dev libffi-dev libssl-dev
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz  
tar xvf Python-3.6.0.tgz
cd Python-3.6.0
./configure --enable-optimizations  
make -j8  
sudo make altinstall
python3.6

如果看到以下错误 --
zipimport.ZipImportError: 无法解压数据; zlib不可用 make: *** [altinstall] 错误1
请尝试:
sudo apt-get install zlib1g-dev

验证:

在Python3.6中创建虚拟环境:

python3.6 -m venv testenv
source testenv/bin/activate
pip install pep8

使用pip:

(testenv) vagrant@pvagrant-dev-vm:~$ pip install pep8
*Collecting pep8
  Downloading pep8-1.7.0-py2.py3-none-any.whl (41kB)
    100% |████████████████████████████████| 51kB 4.1MB/s
Installing collected packages: pep8
Successfully installed pep8-1.7.0*

(testenv) vagrant@pvagrant-dev-vm:~$ pip list

pep8 (1.7.0) 
pip (9.0.1)
setuptools (28.8.0)

1
make -j8 中的 -j8 是什么意思? - tommy.carstensen
4
-j [jobs],--jobs[=jobs] 指定同时运行的作业(命令)数量。如果有多个-j选项,则以最后一个为准。如果-j选项没有参数,则make将不会限制可以同时运行的作业数。如需更多信息,请参阅make的man页面。 - Py_minion
1
注意:编译和安装需要相当长的时间(当然这取决于您的系统)。对我来说,使用 AMD FX(tm)-9590 八核处理器大约花了20分钟,但是它成功了。 - MikeyE
2
你是说如果没有安装libssl-dev,那么编译后需要重新安装吗? - tread
1
@surfer190 你说得对!我忘记安装 libssl-dev,然后遇到了 OP 中描述的错误。安装了 libssl-dev,重新编译和安装后,pip 就可以正常工作了。 - MikeyE
libffi-dev 真的需要吗?我好像没有用它就编译并安装成功了。 - user3183018

14

当我尝试使用Python3.6.0创建虚拟环境时,我遇到了相同的问题。这是我在Mac OS X 10.12.2上的解决方案(Py_minion的评论非常接近):

设置

我通过以下步骤创建环境: 下载Python3.6.0 运行

./configure --prefix=<some_path>`
make
make install
mkvirtualenv --python=<some_path/bin/python3.6> foo

基本上类似于:https://dev59.com/bXI_5IYBdhLWcg3wFu7L#11301911

如果您遇到了和我一样的问题,运行make时会出现相似的行。

The necessary bits to build these optional modules were not found: _ssl

解决方案

安装openssl

brew install openssl
brew unlink openssl && brew link openssl --force

更改模块/设置或模块/设置.dist

您可以在下载的Python版本目录中找到这些文件。

取消注释并且必要时更改第209至211行(我不得不将SSL变量更改为我的openssl位置)。

SSL=/usr/local/opt/openssl <---- THIS DEPENDS ON YOUR INSTALLATION
_ssl _ssl.c \
    -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
    -L$(SSL)/lib -lssl -lcrypto

鉴于这是openssl的位置

设置环境变量

export CFLAGS="-I$(brew --prefix openssl)/include"
export LDFLAGS="-L$(brew --prefix openssl)/lib"

重新编译并安装

运行中

./configure --prefix=<some_path>`
make
make install
mkvirtualenv --python=<some_path/bin/python3.6> foo

再次为我解决了问题


对于那些没有sudo和brew的用户:可以从https://www.openssl.org/获取openssl。 - tommy.carstensen

8

运行 make 命令时,在 shell 输出中向我报告了以下信息:

The necessary bits to build these optional modules were not found:
_bz2                  _dbm                  _gdbm              
_sqlite3              _ssl                  _tkinter           
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

在我的情况下解决问题的方法(Linux Mint 18.1,openssl已安装)是编辑Python-3.6.0文件夹中的setup.py,将openssl安装路径中ssl.h文件所在的路径(/usr/include/openssl/ssl.h)添加到其中。这里是我添加了'/usr/include'一行的部分内容:
    # Detect SSL support for the socket module (via _ssl)
    search_for_ssl_incs_in = [
                          '/usr/local/ssl/include/',
                          '/usr/contrib/ssl/include/',
                          '/usr/include/'
                         ]
    ssl_incs = find_file('openssl/ssl.h', inc_dirs,
                         search_for_ssl_incs_in
                         )

2
太高兴了,我找到了你的答案,它为我解决了这个问题(Ubuntu 16.04)。 - AnaPana
这在我的Ubuntu 16.04上有效。应该是最受欢迎的答案。 - waqasgard

7

我已经在Ubuntu-16.04.1上解决了这个问题。 首先,您需要安装必要的库。要安装,请打开终端(Ctrl+Alt+T),然后输入;

 sudo apt-get install build-essential checkinstall
 sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

之后进入存放 Python 文件的目录,重新配置并重新安装 Python3.6。

 cd /opt/Python3.6/
./configure
 make 
sudo make install

注意
如果您通过ppa安装了Python3.6,则需要重新安装;

sudo apt-get install python3.6

现在你应该能够使用 pip3.6

在Debian上运行得非常好(我从源代码安装了Python3.6)。谢谢。 - byxor

6

当我在CentOS 7下从源代码构建Python 3.6.1时,遇到了相同的错误。 对于CentOS7,我不得不首先执行以下操作:

sudo yum install openssl-dev

然后:

./configure --enable-optimizations
make altinstall

现在 pip3.6 可以使用了 :-)

相同的配置 :) - ThanhLoyal
1
可以正常工作,但对于 RHEL 7.3 ,需要执行 sudo yum install openssl-devel - FormerAtariUser

1

完整的脚本可以在这里找到

安装先决条件

对于RHEL/CentOS

sudo yum -y install gcc gcc-c++ zlib zlib-devel libffi-devel openssl-devel wget

对于Ubuntu/Debian

sudo apt-get -y install build-essential python-dev python-setuptools python-pip python-smbus libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libffi-dev wget

下载Python

根据您想要的Python版本进行修改

Python版本

cd /var/tmp sudo wget https://www.python.org/ftp/python/3.x.x/Python-x.x.x.tgz sudo tar xf Python-3.*.tgz cd Python-3*

配置/编译/安装

sudo ./configure --enable-optimizations --enable-shared --prefix=/usr/local sudo make && make altinstall

清理共享库并添加到路径

去除调试符号可以加快执行并行脚本的速度。

sudo make && make altinstall sudo strip /usr/local/lib/libpython3.7m.so.1.0 sudo echo 'export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib' >> /etc/profile.d/python.sh sudo echo 'export PATH=${PATH}:~/usr/local/bin/' >> /etc/profile.d/python.sh sudo echo '/usr/local/lib' >> /etc/ld.so.conf sudo ldconfig

参考资料

  • Gist(代码片段分享平台)
  • Stack Overflow(全球最大的编程问答社区)
  • Stack Overflow(全球最大的编程问答社区)
  • Daniel Erikson(Unix/Linux系统管理员和网络工程师)
  • Unix StackExchange(Unix/Linux操作系统相关问题的问答社区)
  • TLDP(Linux文档项目,提供关于Linux系统的详细文档)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接