这是一位好友写的文章,实操性很强。
Linux系统中默认的python版本为Python 2,而根据Python的官方邮件消息,Python 2即将于2020年终止所有的支持。简单的将Python由2升级至3则会有很大的技术风险隐患,因为Linux的一些常用指令,如yum指令,会对python存在依赖。所以我们需要找到一种对linux系统无影响的python3环境搭建过程,而本文即是对此的记录和思考。
既然决定整个搭建过程的前置条件是对Linux系统无影响,也就限定了不能使用常规的系统目录,那么依据公司的管理规定,则约定将整个java环境搭建在/opt/app目录下。所以也就无需使用root用户,仅使用普通的ppuser用户和环境变量的设置即可完成。
在整个搭建过程中,大致可分成三个步骤,一是原始应用包的编译和构建,二是Python包的环境变量设置,三是Python包的实际部署。
在原始应用包的编译和构建过程中,需要使用root用户和普通的ppuser用户,而在实际部署环节中仅需要使用ppuser用户即可。
1. 下载
登录Python的官网下载python,
https://www.python.org/downloads/
考虑到未来应用的扩展需求,下载Python 3系列的版本Python-3.7.0.tgz。
由于一些应用在运行过程中,需要使用ssl库,所以需要预先下载openssl,编译进Python的包内。
从openssl的官网下载安装包,openssl-1.0.2j.tar.gz
http://www.openssl.org/source/openssl-1.0.2j.tar.gz
2. 预安装包
由于在编译过程中存在依赖,所以需要使用root用户预安装依赖包。
yum install zlib-devel.x86_64
yum install libffi-devel
yum install sqlite-devel
3. 上传至服务器
将Python-3.7.0.tgz和openssl-1.0.2j.tar.gz上传至服务器的/opt/app/software目录下。
安装openssl依赖库,使用root用户,执行以下指令,
cd /opt/app/software
tar -xzf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j
./config --prefix=/usr/local/openssl -fPIC no-gost no-shared no-zlib
make depend
make
make install
此时需要注意的是在./config命令中需要指定安装目录,即--prefix参数描述的,至于其他的参数,则可以简单复制即可。
安装Python包,使用ppuser用户,在服务器的/opt/app/software目录下创建python-3.7.0文件夹,将Python-3.7.0.tgz上传至此目录。
使用ppuser用户,分别执行以下指令,对Python 3进行配置:
mkdir -p /opt/app/python-3.7.0
cd /opt/app/software/python-3.7.0
tar xvf Python-3.7.0.tgz
cd Python-3.7.0
./configure --prefix=/opt/app/python-3.7.0 --enable-shared CFLAGS=-fPIC --with-ssl
--with-openssl=/usr/local/openssl --enable-loadable-sqlite-extensions
这里需要注意的是:
--prefix需要指定为/opt/app/python-3.7.0,否则会安装到操作系统的默认目录中。
--with-ssl --with-openssl=/usr/local/openssl,需要与之前安装openssl的路径保持一致
--enable-loadable-sqlite-extensions,是表示启用sqllite扩展内容,可以使用sqlite的库,方便后续一些应用的操作。
为了支持ssl,还需要执行以下操作。
cd Modules
vi Setup.dist
在这里,需要修改Setup.dist文件,启用ssl的设置。去掉注释,启用以下内容,
_socket socketmodule.c
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
编译并安装
make
make install
注意:make install时会报错,属于正常情况,因为ppuser是普通用户,没有系统权限。这是符合预期的,因为我们并不期望修改系统默认的python包。
到此,python 3的安装包的编译、安装环节已经完成,进行测试验证。
python
import ssl
import sqlite3
1. 环境变量设置
众所周知,linux系统各个应用程序的运行都是依靠环境变量设置的内容,所以我们既然不期望修改系统默认的python 2.6,就应该为python 3.7采用独立的环境变量配置,
cd /opt/app/python-3.7.0
touch python-3.7.env
vi python-3.7.env
在python-3.7.env中填写如下内容:
# set python 3.7 env
PYTHON_HOME=/opt/app/python-3.7.0
PATH=$PYTHON_HOME/bin/:$PATH
export PATH
LD_LIBRARY_PATH=$PYTHON_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
PYTHONPATH=$PYTHON_HOME/lib/python3.7/site-packages
export PYTHONPATH
这个环境变量设置脚本的目的是声明python的bin目录放入PATH,声明动态链接库、以及声明python所需的包路径。
2. 创建python软链接
在平时使用中,大家更习惯使用python、pip进行安装python的包,而不是python3、pip3,所以需要使用软链接进行指向,
cd /opt/app/python-3.7.0/bin
ln -s python3 python
ln -s pip3 pip
3. python打包
我们将已经编译好,且配置了环境变量文件的python-3.7.0进行打包,方便后续的实际部署使用。
/opt/app/software/python-3.7.0
tar cvf Python-3.7.0.tar python-3.7.0
此时,生成的Python-3.7.0.tar包就是实际部署的包文件。
1. 上传文件
在需要部署的服务器上,创建相应的目录文件。
mkdir -p /opt/app
cd /opt/app
上传Python-3.7.0.tar包至此目录,执行解压缩Python-3.7.0.tar包,
tar xvf python-3.7.0.tar
则在/opt/app下,生成了相应的python-3.7.0目录,
2. 执行并测试
此时,当用户登陆操作系统时,使用的是python 2的程序,可通过如下指令查看。
python -V
结果返回,
这种情况下,并不影响linux原有环境命令的任何使用。当用户需要执行python3程序时,可通过以下指令执行首先声明环境变量,
. /opt/app/python-3.7.0/python-3.7.env
然后执行具体的python指令检查版本,
python -V
结果返回,
至此,实现了Linux系统中默认的python2版本与我们引入的python3版本同时并存而互不影响。
从这里面可以看出,虽然我们在编译、环境变量脚本、打包等环节的操作较为繁琐,但一旦进行实际部署时,就仅需要上传文件后解压缩即可。
这就体现了在平时设计中将有限次数的操作详细化、反复重复的操作的精简化。同时,若哪天不再使用python3程序时,仅需将/opt/app/python-3.7.0文件夹直接删除即可。