服务器上安装Python 2环境,最稳妥的方式是用系统包管理器直接装,比如CentOS上执行yum install python2,Debian/Ubuntu上执行apt install python2,装完立刻能用;如果系统源里没有,再考虑源码编译。 但真正动手前得先想清楚一件事:你要跑的到底是Python 2.7的哪类脚本,因为2020年Python 2官方就已停止维护,服务器环境里裸装一个老版本解释器,隐患不在于“装不上”,而在于“装上之后怎么管”。
为什么现在还有人在服务器上装py2
业内专家指出,生产环境里大量存量业务系统用的是十年前写好的Python 2脚本,尤其是金融、传统制造业、政府项目的内网服务器,这些系统跑得好好的,没人愿意为“升级Python 3”去重写几千行代码,更怕升级之后依赖库不兼容导致业务中断。
另外一个典型场景是运维工具链,不少老牌运维工具、自动化脚本、甚至部分网络设备的配置接口,底层还依赖Python 2.7的特定行为,比如某些版本的Ansible、SaltStack插件,或者自定义的监控采集脚本,写的时候就是按Python 2的语法来的,这个时候服务器安装python2环境不是“图新鲜”,纯属“被兼容性绑架”。
但要注意一个度:如果是新写的项目,现在没人建议你再往Python 2的坑里跳,装py2是为了让老业务继续喘气,不是为了给新代码找借口。
服务器安装python2环境前的准备工作
动手之前先看服务器什么系统,不同发行版的软件源策略完全不同,盲目执行安装命令大概率报错。
- CentOS / RHEL 7/8:官方源里Python 2还在,CentOS 7内置Python 2.7.5,CentOS 8需要单独启用powertools或AppStream源。
- Ubuntu 20.04及以上:官方源早已移除Python 2,想装得用
universe源加上python2包,或者直接走源码编译。 - Debian 10/11:Debian 10还带Python 2.7,Debian 11开始彻底移除,只能编译或用第三方源。
先检查服务器上是否已经有Python 2
登录服务器之后,先执行这条命令看看现状:
python2 --version
python --version
很多老服务器其实默认就带Python 2,只是你忘了他存在,如果命令提示command not found,接着检查/usr/bin/python和/usr/local/bin/python,有时候装了但没写进PATH。
确认系统架构和权限
- 用
uname -m看是x86_64还是aarch64,源码编译时架构影响编译参数。 - 确认当前用户有没有sudo权限,装系统级Python 2必须要有root权限。
- 检查磁盘空间,
df -h /usr,源码编译需要至少2GB临时空间。
这两步做好,再往下走就不容易卡壳。
服务器安装python2环境的三种主流方式
| 安装方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 系统包管理器 | CentOS 7、Debian 10等老系统 | 一键安装,自动配置PATH和依赖 | 源里没有就白搭 |
| 源码编译 | 新系统、定制化需求 | 完全可控,可指定安装路径 | 耗时长,依赖库得自己装 |
| 虚拟环境/容器 | 不想污染系统环境 | 隔离干净,不影响Python 3 | 需要Docker或virtualenv支撑 |
系统包管理器直接装(最推荐)
CentOS 7/8环境下:
sudo yum install -y python2
python2 --version
CentOS 8的话,Python 2不在默认的AppStream里,需要先启用:
sudo dnf install -y python2
如果提示找不到包,就去/etc/yum.repos.d/里的源配置看一下,把powertools仓库打开再试。
Debian 10环境:
sudo apt update
sudo apt install -y python2
Ubuntu 20.04及以上:
sudo apt update
sudo apt install -y python2-minimal
这个包只是解释器核心,没有pip、没有setuptools,装完还得手动补。
用系统包管理器装的好处是:依赖库(比如openssl、sqlite3)会跟着系统版本自动匹配,编译出来的Python 2和系统底层库兼容性最好。
源码编译安装Python 2.7
系统源里明明没有Python 2的包,但业务脚本又必须在Python 2下跑,那就只能编译,这一套流程在2026年依然适用,因为Python 2.7.18空包已经很久没变过。
先装编译依赖:
sudo yum install -y gcc gcc-c++ make openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel libffi-devel
Ubuntu系对应的是:
sudo apt install -y build-essential libssl-dev libbz2-dev zlib1g-dev libreadline-dev libsqlite3-dev libffi-dev
然后下载源码包,注意一定要用官方的2.7.18版本:
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar -xzf Python-2.7.18.tgz
cd Python-2.7.18
配置编译参数,建议指定安装路径,避免覆盖系统默认的Python 3:
./configure --enable-optimizations --prefix=/usr/local/python2
make -j4
sudo make install
编译时间取决于服务器配置,一般需要10到20分钟,装完之后做软链:
sudo ln -s /usr/local/python2/bin/python2.7 /usr/local/bin/python2
验证一下:
python2 -V
源码编译有个坑:Python 2.7的官网源码包在2020年之后就不再更新,所以编译出来的解释器不带OpenSSL 1.1以上的新版支持,如果你的脚本要访问HTTPS接口,很可能报ssl module错误,解决办法是编译前确保系统装了openssl-devel,并且在./configure里手动指定openssl路径。
Docker容器跑Python 2(最省心)
如果不想在宿主机上折腾编译依赖和系统环境,直接用Docker拉一个Python 2的镜像是最快的路径。
docker run -it --rm -v /your_code:/app python:2.7 bash
这个镜像自带Python 2.7.18和pip,兼容性经过多年沉淀,基本不会出幺蛾子,进入容器之后直接运行脚本:
cd /app && python your_script.py
容器方式的优势是对宿主机零污染,而且可以随意指定依赖版本,缺点是容器内网络访问、文件权限管理比裸装麻烦一点。
Python 2和Python 3共存怎么配置
这是服务器上最常遇到的问题,难点不在安装,而在两个版本同时存在时,如何保证pip、命令行调用、脚本shebang都不串台。
用绝对路径调用
最粗暴的方式,不用管PATH优先级,直接用绝对路径:
/usr/bin/python2 /your_script.py
/usr/local/bin/python3 /your_script.py
这种方式适合手动跑脚本,不适合定时任务和系统服务。
用alternatives机制(CentOS系)
CentOS提供了alternatives工具来管理多版本命令优先级:
sudo alternatives --install /usr/bin/python python /usr/bin/python2 2
sudo alternatives --install /usr/bin/python python /usr/local/bin/python3 3
sudo alternatives --config python
执行最后一条命令后,终端会列出所有候选版本,输入编号回车就能切换默认python指向,但注意,系统内部的一些服务(比如firewalld)可能依赖特定Python版本,随意切换会导致这些服务起不来。
虚拟环境隔离(项目级解决方案)
生产环境更推荐每个项目用独立的虚拟环境,互不干扰:
python2 -m pip install virtualenv
virtualenv /opt/venv/py2_env --python=python2
source /opt/venv/py2_env/bin/activate
激活之后shell里的python直接指向Python 2,pip也是对应版本,完全隔离,退出时执行deactivate即可。
py2环境安装后必须做的3件事
装完只是第一步,接下来这几步不做,后面迟早出问题。
安装pip和setuptools
Python 2.7.18的官方发布包里不带pip,得手动装:
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py
装完检查版本:
pip2 --version
配置国内镜像源(加速依赖下载)
国内服务器直接从PyPI拉包经常超时,改一下pip配置:
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
EOF
补充核心依赖库
Python 2.7自带的模块不算全,大多数业务脚本要用到MySQL、Requests、Six这些库:
pip2 install requests six MySQL-python
如果是编译安装的Python 2,很可能缺socket的SSL支持,测试一下:
python2 -c "import ssl; print(ssl.OPENSSL_VERSION)"
如果报错,就重新编译一次,指定openssl路径。
服务器安装python2环境报错排查思路
configure: error: no acceptable C compiler found
这明显是编译环境没装全,回到上面“安装编译依赖”那一步,确认gcc装了没有。
zipimport.ZipImportError: can't decompress data
源码编译的时候缺少zlib库,重新安装zlib-devel,然后清理编译目录重来一次。
ModuleNotFoundError: No module named pip
Python 2的pip安装包需要先从bootstrap.pypa.io下载,这个域名在2026年后只保留旧版文件,确认下载链接没失效。
Could not find a version that satisfies the requirement
大多数情况是pip指向了Python 3的版本,用pip2命令替代pip。
这些坑没有一个是死结,大部分都会在10分钟内解决,多数情况下,装py2报错就是下面三类原因:依赖库没装全、PATH指向搞混了、源码编译参数不对。
2026年维护py2环境的安全策略
既然Python 2已经停止官方支持,服务器上跑着Python 2就意味着接受未知安全漏洞的风险,行业共识认为,如果真的无法迁走,至少做好这几层防护:
- 将Python 2服务隔离在内部网络,不暴露公网端口。
- 用防火墙限制只允许特定IP访问该服务端口。
- 定期备份Python 2应用的数据和配置。
- 在系统层面装好入侵检测工具,监控异常进程行为。
- 尽量用Docker或独立用户跑Python 2进程,缩小故障爆炸半径。
这套策略的核心思路是:既然代码层面动不了,就在系统和网络层面把风险摁住。
关于py2环境安装的常见问题解答
Q:python2和python3能否在同一台服务器上同时运行?
完全可以,Python 2和Python 3的安装路径、动态库、pip工具都是独立的,只要不用update-alternatives强行改系统默认python指向,两者共存不会冲突,平时执行脚本时用python2和python3命令区分即可,项目内部建议用virtualenv把依赖隔离在各自目录下。
Q:centos服务器安装python2环境要不要先卸载python3?
不要卸载,CentOS系统自身的yum和部分管理工具依赖Python 2,而新装的软件又依赖Python 3,两个版本都是系统正常运行的一部分,卸载任何一个都可能导致系统管理命令崩溃。
Q:源码编译Python 2.7有哪些必装的依赖库?
必装的是gcc、gcc-c++、make、zlib-devel、openssl-devel、readline-devel、sqlite-devel,按需添加的是libffi-devel(用于cffi模块)、bzip2-devel(用于bz2压缩模块)、ncurses-devel(用于终端交互功能),装全了之后再编译,一次通过率最高。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/692118.html





