arm linux 移植 python3.6


背景:

  人生苦短,我用Python。

說明:

  編譯Python的嵌入式版需要解釋器解析setup.py從而編譯Python的模塊,因此需要先編譯出host的解釋器。(有點像Go語言)

  Python   : Python 3.7.6

編譯:

##
#    Copyright By Schips, All Rights Reserved
#    https://gitee.com/schips/

#    File Name:  make.sh
#    Created  :  Tue 24 Dec 2019 04:20:51 PM CST

##
#!/bin/sh
BASE=`pwd`
BUILD_HOST=arm-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 bulid-${BUILD_HOST} -p
    cd  bulid-${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目錄放到目標板中,添加以下環境變量:

(假設 python 目錄放在 /mnt/nfs/python)

export PATH=$PATH:/mnt/nfs/python/bin   # 用於執行python,填寫 Python目錄中的Bin目錄即可export PYTHONPATH=               # 這一行是為了額外的模塊的搜索,根據實際模塊的使用情況進行填寫,可留空,可參考附錄進行填寫
export PYTHONHOME=/mnt/nfs/python      # 最終的安裝路徑,必須填寫

(如果不添加,會導致;關於這里可以參考:根據: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 PYTHONPATH='/path/to/pythondir:/path/to/pythondir/lib-dynload:/path/to/pythondir/site-packages'
export PYTHONHOME=/path/to/pythondir

最終結果:

img

附錄:有關錯誤信息以及處理辦法

$PYTHONPATH路徑問題

錯誤信息:

ImportError: No module named site

解決:

a.查找site相關路徑

find / -name site.py*
/usr/lib64/python2.7/site.pyc
/usr/lib64/python2.7/site.py
/usr/lib64/python2.7/site.pyo

b.將路徑添加到$PYTHONPATH中

export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM