Solo  当前访客:0 开始使用


离线环境下搭建python运行环境

A. 缘起

首先讲一下这里的业务场景:离线环境。对于一些数据安全要求很高的环境,比如生产环境,通常会处于一个隔离区。也就是说连不上外网的,而且在这样的机器上,用户往往也没有root权限。在这种情况下,本来安装升级lib这样的简单的工作,就会变得很曲折。这篇文章,以我碰到的一个具体的问题为例子来说明如何给离线环境准备python运行环境,以及一些必备的pythonn package。

1 . 我碰到的问题

我目前在负责shifu的一块工作是,在分布式环境下,实现tensorboard来监控集群内tensorflow运行模型的情况。在启动tensorboard的过程中,发现缺少了sqlite3这个python模块。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: No module named _sqlite3

经过一番查证发现,默认python2.5以上的都默认自带sqlite包的,除非从源码编译可能会有这种问题。所以,我不得不重新编译了python和准备tensorflow等lib,打包成一个离线包。

B. 解决方案

我们离线环境的机器是redhat os,GCC版本是4.8.5, glibc版本是2.17, 因此编译python的环境也需要大致类似,同一个体系的操作系统,相兼容的C环境。

1. 准备编译机器

因为redhat是一个收费操作系统,因此我只能退而求其次,选择cent os,用的版本是oel-6-latest。

2. 准备C环境

这里包含两个部分,GCC和glibc。

2.1 GCC环境,版本4.8.5

1.    sudo yum install gcc gcc-c++ libstdc++-devel.i686 glibc-devel.i686
2.    wget http://gnu.mirror.iweb.com/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
3.    tar xzvf gcc-4.8.5.tar.gz && cd gcc-4.8.5
4.    sed -i 's/ftp/http/' ./contrib/download_prerequisites
5.    ./contrib/download_prerequisites
6.    mkdir build && cd build
7.    ../configure && make && sudo make install && echo "success"
8.    sudo echo "/usr/local/lib64" > /etc/ld.so.conf.d/usr-local-lib64.conf
9.    sudo ldconfig
10. cd /usr/lib64/ && sudo rm libstdc++.so.6 && sudo ln -s /usr/local/lib64/libstdc++.so.6.0.19 libstdc++.so.6

2.2 glibc版本2.17

1.    wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
2.    tar xzvf glibc-2.17.tar.gz && cd glibc-2.17 && mkdir build && cd build
3.    ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
4.    make
5.    sudo make install
6.    strings /lib64/libc.so.6 |grep GLIBC_

3. 从源码编译python

在编译的过程中,我冲上去就编译了,后来发现有一些步骤是需要先预备的,又退回来准备环境,重新编译。

3.1 预备工作

准备一些系统环境,比如sqlite-devel,如果系统没有这个,是编译不出带sqlite3的python的。

sudo yum -y install zlib*
sudo yum install -y openssl-devel
sudo yum install sqlite-devel

3.2 编译python

这里比较关键的地方在于设置prefix参数指定某个folder,即你想编译出来的离线包的目录。

git clone https://github.com/python/cpython
cd cpython
./configure --prefix=$HOME/python3.6
make
make install

4. 添加离线环境需要的python库

在安装tensorflow的时候,碰到一个SSL的问题,可能是因为我的那台机器在GCP的缘故。所以对pip进行了配置。如果在aliyun或者其他机器能够正常使用pip安装package的时候,可以忽略4.1步骤。

4.1 配置pip

在用户home目录下新建.pip文件夹,然后生成pip.conf.

[global]
index-url=[http://mirrors.aliyun.com/pypi/simple/](http://mirrors.aliyun.com/pypi/simple/)

配置local语言环境:

export LC_ALL="en_US.UTF-8”
export LC_CTYPE="en_US.UTF-8"

4.2 使用pip安装package

首先升级pip到1.9以上版本,然后安装tensorflow。之所以这里选择1.5.0版本,是因为高版本在一些比较老的机器上会报错误“illegal instruction (core dumped)”。

./python3.6/bin/pip3 install --upgrade pip  --trusted-host http://mirrors.aliyun.com/
./python3.6/bin/pip3 install tensorflow==1.5.0 --trusted-host http://mirrors.aliyun.com/

5. 打包python包上传到离线环境

用zip打包上传

zip -r python3.6.zip python3.6/

在离线环境启动tensorboard

${HOME}/python3.6/bin/python3  ${HOME}/python3.6/lib/python3.6/site-packages/tensorboard/main.py --logdir=./train/linreg

通过ctrix访问tensorboard
ScreenShot20191213at9.48.48PM.png


标题:离线环境下搭建python运行环境
作者:wuhaifengdhu
地址:https://wudevin.cn/articles/2019/12/13/1576246044796.html
只有站在峰顶的人,才能看见星辰大海。
新一篇: Solo博客升级 旧一篇: Shell脚本的书写