这是一位好友写的文章,实操性很强。

背景因素

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用户即可。

预处理

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev

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

二、 Python包的环境变量设置和部署

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包就是实际部署的包文件。

三、 Python包的实际部署

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文件夹直接删除即可。