pythonをコンパイルしてアームボードに移植します(1)

バックグラウンド:

  人生は短いです、私はPythonを使用しています。アームボードでpythonを実行できれば、多くのことを簡単かつ楽しく行うことができます。

説明:

  組み込みバージョンのPythonをコンパイルするには、setup.pyを解析してPythonモジュールをコンパイルするインタープリターが必要なため、最初にホストインタープリターをコンパイルする必要があります。(Go言語に少し似ています)

  Python    :  Python 3.7.6

コンパイル:

ホームの下に新しいディレクトリ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権限が必要であり、実行プロセスにはパスワードが必要ですが、トラブルを回避するために./make.shをsudoすることはできません。そうしないと、ファイル権限の問題が発生し、クロスコンパイラが実行できなくなります。

デプロイ:

コンパイルされたpythonディレクトリをターゲットボードに配置し、次の環境変数を追加します。

(pythonディレクトリが/ mnt / nfs / pythonに配置されていると仮定します)

export PATH=$PATH:/mnt/nfs/python/bin   # 用于执行python,填写 Python目录中的Bin目录即可
export PYTHONPATH=               # 这一行是为了额外的模块的搜索,根据实际模块的使用情况进行填写,可留空,可参考附录进行填写
export PYTHONHOME=/mnt/nfs/python      # 最终的安装路径,必须填写
  • 環境変数は/ etc / profileファイルの最後に書き込むことができ、ソース/ 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(PYTHONPATH変数は、モジュールファイルのデフォルトの検索パスを拡張します)。

PYTHONHOMEは、標準のpythonライブラリに使用されます。

設定変数の形式はシェル形式にすることができます。たとえば、設定する環境変数は次のとおりです。

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と入力し、タブを押してpython3を自動的に完了し、環境変数が正常に設定されたことを示し、python3を実行してreplを入力すると、以下に示すようにpythonを正常に実行できます。

      ただし、一部の基本モジュールは移植されておらず、多くのモジュールは後で依存します。replにhelp( 'modules')と入力して、既存のモジュールを表示できます。現在、zlib、_ctypes、_sslなどのモジュールがありません。ピップを実装するために必要です。その中で、_ctypesはsetuptoolsの依存モジュールです。setuptoolsを使用すると、サードパーティのモジュールをボードにダウンロードして手動でインストールすることもできます。python3.7より前のバージョンでは、_ctypesは追加の移植なしでpythonでコンパイルできます。 。

後の記事では、これらの必要なモジュールを移植する方法について引き続き説明します

おすすめ

転載: blog.csdn.net/qq_34440409/article/details/109287326