前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >避坑-编译安装 Python 时遇到无法构建 SSL

避坑-编译安装 Python 时遇到无法构建 SSL

作者头像
somenzz
发布2024-06-03 16:00:41
3280
发布2024-06-03 16:00:41
举报
文章被收录于专栏:Python七号Python七号

然有了 docker,为啥还需要编译安装 Python 呢,是不是自找麻烦。 docker 是方便,但是如果机器本身就自带 Python 最新版本,作为一个开发环境,岂不更方便?

笔者编译安装过不下 10 次,每次还是被这个错误浪费不少时间,今天就总结一下,让你在编译安装 Python 的过程中避坑。

步骤 1: 安装依赖

在编译 Python 之前,你需要确保你的系统安装了所有必须的构建依赖。在基于 Debian 的系统上,像 Ubuntu 这样的,可以这样做:

代码语言:javascript
复制
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev \
libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev libbz2-dev

对于基于 Red Hat 的系统,比如 CentOS 或者 Fedora,可以这样做:

代码语言:javascript
复制
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel \
sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

步骤 2: 下载 Python 源码

可以从 Python 官方网站或其在 GitHub 的镜像库下载源码。使用 wget 从官方源下载的命令:

代码语言:javascript
复制
wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz

然后解压下载的文件:

代码语言:javascript
复制
tar -xvzf Python-3.12.3.tgz

解压后,切换到源码目录:

代码语言:javascript
复制
cd Python-3.12.3

步骤 3: 配置编译选项

在编译之前,配置安装选项,可以使用 ./configure 脚本。可以指定诸如安装目录的选项(通过 --prefix 参数)和编译优化(在 Python 3.12,通过 --enable-optimizations 开启编译优化可能会显著提升 Python 性能但是会使编译过程更长)。

代码语言:javascript
复制
./configure --enable-optimizations --prefix=/usr/local/python3.12

这里,我们将 Python 安装到 /usr/local/python3.12,然后手动添加 Path,这样不会影响其他版本的 Python,比如 python2.

还有许多其他的配置选项,可以通过运行 ./configure --help 来查看它们。

步骤 4: 编译 Python

运行 make 命令来编译 Python:

代码语言:javascript
复制
make -j 8   # '8' 是编译时使用的核心数,根据你的系统调整

由于编译时间较长,我们可以使用 -j 选项会在编译时进行并行处理,以加快编译速度。这个数字最好设置为你的处理器核心数。

到这里,我们通常会遇到 ssl 报错:

代码语言:javascript
复制
Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer

而操作系统上的 openssl 通常都是低于 1.1.1 的,遇到这种情况,就 openssl 官网下载新版本,编译安装,然后把相关的库收集到安装路径的 lib 目录即可。但是安装 openssl 通常也不是那么顺利的。根据以下步骤进行

代码语言:javascript
复制
mkdir ~/openssl
cd ~/openssl
wget https://www.openssl.org/source/openssl-3.3.0.tar.gz
tar -zxvf openssl-3.3.0.tar.gz
cd openssl-3.3.0
./config --prefix=/usr/local/ssl3.3 --openssldir=/usr/local/ssl3.3 shared zlib
make
make install

如果上述步骤在 config 步骤报错:Can't locate IPC/Cmd.pm in @INC ,则需要安装下面的依赖包:

代码语言:javascript
复制
sudo yum groupinstall 'Development Tools'
sudo yum install perl-core zlib-devel

上述的步骤将 openssl 安装在 /usr/local/ssl3.3 下面,我们可以在命令行(terminal)执行 /usr/local/ssl3.3/bin/openss version 如果执行报错,则需要指定 lib64 的路径 :

代码语言:javascript
复制
sudo vim sudo vim /etc/ld.so.conf.d/openssl.conf
# 加入内容 /usr/local/ssl3.3/lib64
sudo ldconfig

然后在执行 /usr/local/ssl3.3/bin/openss version 即可看到正确的版本信息。

但是编译 Python 之前,还有一个关键的步骤,就是需要在 /usr/local/ssl3.3/ 下创建一个 lib 文件,然后将相应的 so 文件放进去,通过执行下面的命令:

代码语言:javascript
复制
cd ~/openssl/openssl-3.3.0 # 确保再解压的目录中
mkdir /usr/local/ssl3.3/lib
cp ./*.{so,so.3*,a,pc} /usr/local/ssl3.3/lib

步骤 5: 再次配置、编译 Python

运行 make 命令来编译 Python:

代码语言:javascript
复制
./configure --with-openssl=/usr/local/ssl3.3 --prefix=/usr/local/python3.12
make -j 8   # '8' 是编译时使用的核心数,根据你的系统调整

这次就可以顺利完成编译了。

步骤 6: 安装 Python

一旦编译完成,运行以下命令以安装 Python:

代码语言:javascript
复制
sudo make install

我们不需要使用 altinstall 是因为我们指定了自己的安装目录 /usr/local/python3.12。如果不指定安装目录,为了避免替换掉系统的默认 Python 版本,可以使用 altinstall

步骤 6: 验证安装

安装完成后,可以通过调用新安装的 Python 版本来检查它:

代码语言:javascript
复制
/usr/local/bin/python3.12 --version

输出应该显示 Python 的版本号。进入 Python 后,执行 import ssl 验证安装。

代码语言:javascript
复制
$ /usr/local/python3.12/bin/python3
Python 3.12.3 (main, May 23 2024, 15:08:26) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 3.3.0 9 Apr 2024'
>>>

至此完成安装。

参考链接

https://stackoverflow.com/questions/53543477/building-python-3-7-1-ssl-module-failed

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 步骤 1: 安装依赖
  • 步骤 2: 下载 Python 源码
  • 步骤 3: 配置编译选项
  • 步骤 4: 编译 Python
  • 步骤 5: 再次配置、编译 Python
  • 步骤 6: 安装 Python
  • 步骤 6: 验证安装
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档