给arm板编译移植python(一)

背景:

  人生苦短,我用Python。arm板上可以跑python的话,我们就能轻松愉快的做很多事了。

说明:

  编译Python的嵌入式版需要解释器解析setup.py从而编译Python的模块,因此需要先编译出host的解释器。(有点像Go语言)

  Python   : Python 3.7.6

编译:

home下新建一个目录python3.7,在python3.7下新建make.sh脚本。

cd ~
mkdir python3.7
cd python3.7
nano make.sh

编译的话用这个一键编译脚本就可以了,复制以下内容到make.sh,BUILD_HOST需要改成自己的交叉编译器:

#!/bin/sh
BASE=`pwd`
BUILD_HOST=arm-himix200-linux


OUTPUT=${BASE}/install/

make_dirs() {
    cd ${BASE}
    mkdir  compressed  install  source -p
    sudo ls
}

tget () { #try wget
    filename=`basename $1`
    echo "Downloading [${filename}]..."
    if [ ! -f ${filename} ];then
        wget $1
    fi

    echo "[OK] Downloaded [${filename}] "
}


download_package () {
    cd ${BASE}/compressed
    #下载包
    tget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz
}

tar_package () {
    cd ${BASE}/compressed
    ls * > /tmp/list.txt
    for TAR in `cat /tmp/list.txt`
    do
        tar -xf $TAR -C  ../source
    done
    rm -rf /tmp/list.txt
}

make_host () {
    cd ${BASE}/source/Python*
    ./configure
    make && sudo make install
    sudo rm /usr/bin/python
    sudo ln -s /usr/local/bin/python3 /usr/bin/python
}
make_target () {
    cd ${BASE}/source/Python*
    echo `pwd`
    sudo make clean
    mkdir build-${BUILD_HOST} -p
    cd  build-${BUILD_HOST}
    mkdir ${BASE}/install/python -p
    ../configure CC=${BUILD_HOST}-gcc \
    CXX=${BUILD_HOST}-g++ \
    --host=${BUILD_HOST} \
    --build=x86_64-linux-gnu \
    --target=${BUILD_HOST} --disable-ipv6 \
    --prefix=${BASE}/install/python \
    --enable-optimizations \
    ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes
    make && make install
}
make_dirs
download_package
tar_package
#make_host #如果没有的话,需要安装
make_target

查看下本机python是否为python3.7,如果不是需要去掉make_host注释,编译python3.7,保存退出,执行make.sh。

./make.sh

注意:脚本里有些命令需要sudo权限,执行过程需要输入密码,但不可以为了省事sudo ./make.sh,否则会导致文件权限问题使得交叉编译器无法执行。

部署:

将编译生成的python目录放到目标板中,添加以下环境变量:

(假设 python 目录放在 /mnt/nfs/python)

export PATH=$PATH:/mnt/nfs/python/bin   # 用于执行python,填写 Python目录中的Bin目录即可
export PYTHONPATH=               # 这一行是为了额外的模块的搜索,根据实际模块的使用情况进行填写,可留空,可参考附录进行填写
export PYTHONHOME=/mnt/nfs/python      # 最终的安装路径,必须填写
  • 环境变量可以写入/etc/profile文件末尾,执行source /etc/profile以启用。

(如果不添加,会导致;关于这里可以参考:根据:https://askubuntu.com/questions/905372/could-not-find-platform-independent-libraries-prefix)

Fatal Python error: initfsencoding: unable to load the file system codecModuleNotFoundError: No module named 'encodings'Current thread 0xb6f28000 (most recent call first):Aborted有关的解释是这样的:
  •  

必须设置2个环境变量 PYTHONPATH 与 PYTHONHOME.因为python3解释器搜索有关库时依赖这2个变量:

PYTHONPATH 作为 模块 的默认搜索路径 (The PYTHONPATH variable augments the default search path for module files.)

PYTHONHOME 用于 python标准库(PYTHONHOME is used for standard python libraries. ),

设置变量的格式以shell格式即可,例如我设置的环境变量如下:

export PATH=$PATH:/mnt/python/python3.7/bin
export PYTHONPATH='/mnt/python/python3.7:/mnt/python/python3.7/lib:/mnt/python/python3.7/lib/python3.7/site-packages'
export PYTHONHOME=/mnt/python/python3.7

现在可以在板子终端里敲入python按tab可以自动补全为python3的话,说明环境变量设置成功,执行python3进入repl,如下图已经可以正常运行python了。

      但是还有些基础module没有移植进来,后面的话很多module都会依赖到,可以在repl中输入help('modules')查看目前已有的modules,目前缺少zlib,_ctypes,_ssl等模组,这些都是后面实现pip所必须的。其中_ctypes为setuptools依赖模组,有了setuptools我们也可以在板子上下载第三方模组手动安装,在python3.7之前的版本_ctypes是可以随着编译python一起编好的,不需要额外移植。

后面的文章将继续讲如何移植这些必要模组

猜你喜欢

转载自blog.csdn.net/qq_34440409/article/details/109287326