手把手教你用wget在Ubuntu 20.04上安装Python3.8(附加速下载技巧)
在Ubuntu 20.04上优雅部署Python 3.8:从源码构建到环境管理的完整实践
对于许多开发者而言,Ubuntu 20.04 LTS是一个稳定且长期支持的操作系统选择,但其默认的Python版本可能无法满足某些特定项目或库的依赖要求。Python 3.8引入了赋值表达式(海象运算符)、仅位置参数等颇具生产力的新特性,使其成为许多现代应用开发的理想选择。直接从源码构建Python,而非依赖系统包管理器,能赋予你对安装位置、编译选项和运行时环境的完全控制权,这对于创建隔离的开发环境或部署生产服务至关重要。本文将不仅仅是一份安装指南,更是一次深入理解Linux软件构建流程的实践,我会分享如何高效获取源码、处理常见的依赖陷阱,并最终建立一个干净、可管理的Python运行环境。
1. 系统准备与依赖环境搭建
在着手编译任何软件之前,确保你的构建环境是健全的,这能避免后续过程中令人头疼的报错。Ubuntu 20.04默认可能没有包含完整的开发工具链。
首先,更新你的系统包索引,这是保证能获取到最新软件源信息的好习惯:
sudo apt update
接下来,安装编译Python所必需的核心工具和开发库。build-essential 是一个元数据包,它包含了gcc、g++、make、libc-dev等一整套基础编译工具。单独安装gcc有时会遗漏其他必要组件,因此直接安装这个包更省心。
除了基础工具,Python解释器本身以及其标准库中的某些模块(如ssl、sqlite3、zlib)在编译时需要对应的开发头文件。如果缺失这些,编译过程可能不会报错,但最终构建出的Python会缺少某些关键功能模块。例如,没有libssl-dev,ssl模块将不可用,这会导致pip无法通过HTTPS下载包。
一个全面的依赖安装命令如下:
sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev
注意:
-y参数会自动确认安装,省去手动输入“yes”的步骤。如果你希望更谨慎,可以去掉此参数,在安装前查看将要变更的包列表。
安装完成后,可以通过以下命令验证gcc和make是否就位:
gcc --version
make --version
如果看到版本号输出,说明基础工具链已准备就绪。
2. 高效获取Python源码与编译前配置
2.1 选择与下载源码包
官方推荐从Python官网的发布页面获取源码。使用wget是命令行下的标准做法。为了获得最佳下载体验,特别是网络连接不理想时,有几个技巧可以尝试:
- 使用国内镜像源:一些高校和开源组织提供了Python源码的镜像,速度往往更快。例如,你可以替换官方域名。
- 利用
wget的续传和重试功能:网络中断时,使用-c参数可以继续之前的下载,避免重头开始。 - 后台下载:对于大文件,可以添加
-b参数让下载在后台进行,释放当前终端。
一个结合了镜像和稳健性选项的下载命令示例:
wget -c https://mirrors.huaweicloud.com/python/3.8.0/Python-3.8.0.tgz
这里我使用了华为云镜像,并指定了 -c 参数支持断点续传。下载的.tgz是经过gzip压缩的tar归档文件。
提示:始终建议从官方或可信镜像获取安装包,并核对文件的校验和(如SHA256)以确保完整性,防止下载到被篡改的文件。
2.2 解压与进入源码目录
下载完成后,使用tar命令解压。识别压缩格式并正确使用参数很重要:
tar -xzvf Python-3.8.0.tgz
参数解释:
-x:解压-z:处理gzip压缩-v:显示详细过程(可选)-f:指定文件名
解压后会生成一个名为 Python-3.8.0 的目录,进入该目录开始配置和编译:
cd Python-3.8.0
2.3 运行configure脚本进行系统检查与配置
configure 脚本是自动化构建流程的起点。它会检测你的系统环境,检查我们之前安装的依赖库是否可用,并生成一个适配当前系统的 Makefile。
一个常见的配置命令是指定安装前缀(prefix),这决定了Python最终被安装到哪个目录。将其安装到 /usr/local 下是一个标准做法,与系统自带的Python(通常在 /usr/bin)隔离,避免冲突。
./configure --prefix=/usr/local/python3.8 --enable-optimizations
这里有两个关键选项:
--prefix=/usr/local/python3.8:将所有安装文件(二进制文件、库、头文件等)集中放在/usr/local/python3.8目录下。结构清晰,便于后续管理或卸载。--enable-optimizations:启用PGO(Profile Guided Optimization)和LTO(Link Time Optimization)编译优化。这会使编译时间显著延长(可能增加数十分钟),但能生成性能提升约10%-20%的Python解释器。对于生产环境,这个优化是值得的;如果只是用于开发且想快速完成,可以省略此选项。
配置过程会输出大量检查信息。如果看到任何关于某个库“not found”的警告,通常意味着对应的-dev开发包没有安装,需要返回第一步查漏补缺。
3. 编译、安装与多版本管理
3.1 编译源码
配置成功后,当前目录下会生成 Makefile。使用 make 命令开始编译:
make -j 4
-j 4 参数告诉 make 工具使用4个并行任务进行编译,这能充分利用多核CPU,大幅缩短编译时间。你可以将 4 替换为你CPU的物理核心数。
编译过程可能需要10到30分钟,取决于你的机器性能以及是否启用了优化。期间会输出大量的编译信息。只要没有以“error”结尾的致命错误,就可以耐心等待。
3.2 安装到系统
编译完成后,使用 make install 将编译好的文件安装到之前 configure 步骤指定的 --prefix 目录:
sudo make install
需要 sudo 权限是因为要向 /usr/local 目录写入文件。
安装完成后,你指定的安装目录(例如 /usr/local/python3.8)下会出现完整的Python发行版结构:
/usr/local/python3.8/
├── bin/ # 可执行文件,如python3.8, pip3.8
├── include/ # C语言头文件
├── lib/ # 库文件
└── share/ # 共享数据
3.3 管理多个Python版本
现在系统里至少有两个Python:系统自带的(可能是3.8或更低版本)和我们新安装的。直接替换系统默认的 python 命令是危险的操作,可能会影响系统组件的正常运行。
更安全、更灵活的做法是通过 update-alternatives 工具或定义Shell别名来管理。
方法一:使用 update-alternatives(系统级管理)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python3.8/bin/python3.8 1
这条命令注册了一个新的备选项。之后,你可以通过 sudo update-alternatives --config python3 来交互式地选择默认的 python3 命令指向哪个版本。
方法二:修改用户环境变量(~/.bashrc 或 ~/.bash_profile) 在文件末尾添加:
export PATH="/usr/local/python3.8/bin:$PATH"
然后执行 source ~/.bashrc。这样,当你输入 python3 时,Shell会优先在 /usr/local/python3.8/bin 目录下查找。这种方法只影响当前用户。
方法三:创建别名 同样在 ~/.bashrc 中添加:
alias python38='/usr/local/python3.8/bin/python3.8'
alias pip38='/usr/local/python3.8/bin/pip3.8'
这样你可以通过 python38 和 pip38 明确地使用新版本。
验证安装:
/usr/local/python3.8/bin/python3.8 --version
应该输出 Python 3.8.0。
4. 虚拟环境与pip包管理的最佳实践
直接从源码安装Python后,配套的 pip 和 setuptools 通常也已安装好。但最佳实践是永远不要在全局Python环境中直接使用 pip install,除非是安装全局命令行工具。项目依赖应隔离在虚拟环境中。
4.1 使用venv创建虚拟环境
Python 3.3+ 标准库内置了 venv 模块,它是创建轻量级虚拟环境的推荐工具。
# 使用我们新安装的Python 3.8创建虚拟环境
/usr/local/python3.8/bin/python3.8 -m venv my_project_env
# 激活虚拟环境
source my_project_env/bin/activate
激活后,你的命令行提示符前通常会显示环境名 (my_project_env),此时 python 和 pip 命令都指向该虚拟环境内的副本,所有包安装操作都被限制在此环境中。
4.2 配置pip以加速国内下载
在虚拟环境或全局环境中,都可以配置 pip 使用国内镜像源来加速包的下载。创建或编辑 ~/.pip/pip.conf 文件(Linux/macOS):
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
timeout = 120
常用的国内镜像源包括:
- 清华:
https://pypi.tuna.tsinghua.edu.cn/simple - 阿里云:
https://mirrors.aliyun.com/pypi/simple/ - 腾讯云:
https://mirrors.cloud.tencent.com/pypi/simple
4.3 依赖管理与项目重建
在激活的虚拟环境中,使用 pip freeze > requirements.txt 可以导出当前环境的所有包及其精确版本。这份文件是项目可重现性的关键。在新环境中,只需执行 pip install -r requirements.txt 即可一键恢复所有依赖。
为了更健壮的依赖管理,可以考虑使用 pip-tools 或直接使用 Poetry、PDM 这类现代包管理工具,它们能处理更复杂的依赖关系并生成锁文件。
5. 故障排除与进阶调优
即便按照步骤操作,也可能遇到问题。这里是一些常见情况的排查思路。
编译错误 “ModuleNotFoundError: No module named '_ctypes'” 或类似: 这通常是因为 libffi-dev 库没有安装。请返回 第1节,确保所有列出的 -dev 包都已正确安装。有时在配置后安装依赖,需要清理(make distclean 或删除目录重新解压)并重新执行 configure 和 make。
安装后 python3 命令未找到或仍指向旧版本: 检查你的 PATH 环境变量。echo $PATH 查看路径顺序。确保 /usr/local/python3.8/bin 的路径在靠前的位置,或者你正确使用了 update-alternatives 或别名。
自定义编译选项: configure 脚本提供了许多选项来裁剪Python功能,以减小体积或适应特殊环境。例如:
--without-ensurepip:不安装pip。--enable-shared:构建共享库(.so文件),供其他程序链接。--with-system-ffi:使用系统已安装的libffi。
可以通过 ./configure --help 查看所有可用选项。
性能监控: 编译安装完成后,可以进行一个简单性能测试,与系统Python对比:
# 使用time命令测试启动速度
time /usr/local/python3.8/bin/python3.8 -c "print('hello')"
time python3 -c "print('hello')"
从源码构建Python看似步骤繁多,但每一步都加深了你对软件在Linux系统上如何被构建、配置和管理的理解。这种掌控感是直接使用 apt install python3.8 无法带来的。更重要的是,你建立了一套可预测、可重复的部署流程,这对于自动化脚本和服务器配置管理(如使用Ansible)至关重要。下次当你需要特定版本或自定义功能的Python时,这套流程将变得游刃有余。
更多推荐



所有评论(0)