马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
生产服务器上常会遇到完全离线的环境——没有外网、yum 源也访问不了,这种情况下给机器装 Python 3,只能走离线包安装。本文以 CentOS 7(内核 3.10.0)离线安装 Python 3 为例,走一遍完整的落地流程:准备安装包、上传解压、编译安装、做软链接让 python 指向新版本、再离线补第三方包,每一步都给出可复制的命令和踩坑说明。
先确认系统环境
先看下内核和发行版信息,确认是离线环境、以及准备走哪条包路径。
[root@localhost]# cat /proc/version
Linux version 3.10.0-1160.102.1.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)) #1 SMP Tue Oct 17 15:42:21 UTC 2023
从输出能看出是 CentOS 7 的 x86_64 平台、GCC 4.8.5。这个信息很关键:编译 Python 3.10 需要检查一下 GCC 版本是否满足要求,太老的编译器会在 make 阶段报一堆看不懂的错误。
另外大部分 Linux 发行版自带 Python 2 环境(CentOS 7 通常是 2.7),系统工具链也依赖它,所以不能直接把老版本换掉,只能额外装一份 Python 3 再把软链接切过去。
准备 Python 安装包
在一台能上网的机器上,从 Python 官方站点下载对应版本的源码包,比如 3.10.14。选版本时注意两点:一是要和后续要装的第三方包兼容,二是尽量选已经比较稳定的补丁版本。
wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz
下载好之后再传给目标服务器。用 MobaXterm 这类 SSH 客户端可以直接把文件拖进窗口完成上传,也可以用 scp 走命令行,效果一样。传上去之后 cd 到压缩包所在目录,解压:
tar -zxvf Python-3.10.14.tgz
编译安装
解压后进入源码目录,configure 指定安装位置,再编译安装。
cd Python-3.10.14
./configure --prefix=/usr/local/python3
make && make install
三条命令按行执行,第三条是最耗时的,终端会刷出大量 Compiling…… 的滚动信息,耐心等它跑完,中途退出会让后面全部作废。--prefix 后面跟的就是最终安装位置,这里定为 /usr/local/python3,换成本机合适的目录也可以,但下面所有软链接路径要跟着改。
离线环境最大的风险就在这一步:Python 编译依赖 OpenSSL、zlib、readline、sqlite3 等开发库,平时这些头文件是通过 yum 装的 openssl-devel、zlib-devel 这类包,离线环境下装不了。解决办法是提前在一台同版本机器上下好这些 rpm,拷贝到离线机后用 yum localinstall *.rpm 本地安装,再重跑 configure 与 make。若 configure 阶段报 checking for xxx... configure: error,基本就是某个 devel 包缺了。
建立软链接
上一步跑完,Python 3 其实已经装好了,位置在 /usr/local/python3。但这时直接敲 python 弹出来的还是 2.7 版本,因为系统的 /usr/bin/python 软链接仍指向老版本。Windows 靠环境变量解决,Linux 靠软链接。
cd /usr/bin/
ls -il
ls -il 会显示节点号(inode)和链接指向,能看到 python、python2、python2.7 这几条之间的关系。目标很明确:让直接输入 python 时落到 Python 3 上。
sudo rm -rf /usr/bin/python
sudo ln -s /usr/local/python3/bin/python3.10 /usr/bin/python
三步走:先删掉已有软链接,再建一条指向 3.10 的新链接,然后 ls -il 复查并敲 python 验证。注意这里删的是软链接本身(rm -rf 加指向路径时务必确认没写成真实文件路径),老版本解释器本体还在 /usr/bin/python2 里,系统脚本照样能跑。
pip 的软链接类似:
sudo ln -s /usr/local/python3/bin/pip3.10 /usr/bin/pip
这条常见报错:ln: failed to create symbolic link '/usr/bin/pip': File exists。原因是系统里已经存在一条 pip 软链接,直接 ln 会被拒绝。两种处理:一是用 ln -sf 强制替换,二是先看清现有链接指向什么、确认无害后删掉再建。若报错后 pip list 仍能正常列出包,说明系统那条链接本身就能用,不必强改,按实际情况处理即可。
验证版本:
python --version
pip --version
正常会分别打印出 3.10.x 和对应的 pip 版本号,到这里 Python 安装就完成了。
离线安装第三方包
离线版 Python 装模块包,思路和装 Python 本身一致:在有网的机器上先下载好离线包,拷到目标机器再本地安装。模块包常见的两种形态是 tar.gz 源码包和 Linux 平台的 .whl 文件,记得要和 Python 版本号、以及 32/64 位平台对得上。
pip install xxx.whl
python setup.py install
整体流程就四步:
- ① 在有网机器上下好离线包,模块可以从 PyPI 官网搜索对应的发布文件。
- ② 把包拷进离线环境,tar -zxvf 解压后 cd 进目录。
- ③ 执行
pip install . 或 python setup.py install 完成安装。
- ④ 装完 import 一下验证,确认这个包在当前解释器里真的可用。
依赖多的包(比如带 C 扩展的科学计算库)离线时最容易卡在依赖链上,推荐用 pip download 一次性把依赖-all 全部抓下来,打包一起拷过去,再批量本地安装,能省掉大量来回。
坑位提醒
- 别把系统
/usr/bin/python 整个替换成不存在的位置,很多系统脚本写死 python 两个字,链接一断整套工具链就废。
- 用 rm -rf 删软链接时路径要写到链接本身,别少写或多写斜杠。
- make 中途报错先看最上面第一条错误,通常指向缺某个 devel 包,不要被后面的刷屏干扰。
- 编译前确认磁盘有足够空间,源码编译加上安装目录一般占几百 MB。
- 离线环境里 pip 指向新版本后,老 pip 的用法(requirements 文件)照样有效,但注意 requirements 里的包版本要和当前 Python 兼容。
小结
离线装 Python 3 的完整链路就是:确认版本与依赖 → 传源码包 → 解压 → configure 指定 prefix → make && make install → ln -s 把 python/pip 指向新版本 → 离线补模块并 import 验证。核心难点从来不是编译本身,而是开发库和依赖包能不能在离线机上补齐,这两件事提前备好,剩下的就是跑命令等它结束。
qidao123.com企服评测-应用市场 编辑提示:本文为 Linux 离线环境部署 Python 3 的实操记录,命令均可在 CentOS 7 环境复现;替换系统软链接前请先备份原有链接指向,避免影响系统自带脚本。 |