目次
1. 簡単な紹介
1.1 明確な目標
組み込み Linux 開発ボードで実行する必要があるため、x86_64 プラットフォーム ファイルをクロスコンパイルして arm アーキテクチャ ファイルにクロスコンパイルする必要があります。ここで主なことは、Python ソース コードとその依存ライブラリをクロスコンパイルし、次に ubuntu の QT プラットフォーム上でクロスコンパイルして、Python 言語を使用し、組み込み Linux プラットフォームで実行できる実行可能ファイルを構築することです。
1.2 Python バージョンとその背景
- クロスコンパイル ツール チェーン: gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
- ubuntuプラットフォーム:ubuntu18.04.1 64bit
- Pythonバージョン: python3.6.9
- 組み込み Linux 開発ボード カーネル: NXP CORTEX-A7 IMX6ULL
1.3 ステップ
- まず、Python ソース コードとその依存ライブラリをクロスコンパイルします。
- Linux開発ボードに移植
- ubuntu の Qt プラットフォームでのデモ検証の作成
2. Python ソース コードとその依存ライブラリをクロスコンパイルする
2.1 コンパイル手順
- openssl ライブラリをクロスコンパイルします。これは他のほとんどのライブラリで使用される可能性があります。
- zlib ライブラリをクロスコンパイルします。これは、Python ソース コードのインストールに必要な依存ライブラリです。
- libffi ライブラリのクロスコンパイル
- Python ソース コードをクロスコンパイルします。
ここに Baidu ネットワーク ディスクのリンクがあります。関連するライブラリは公式 Web サイトからダウンロードすることも、ここから直接入手することもできます: リンク
: https://pan.baidu.com/s/1mui3Vw8FfxnMUFSjFZhItA
抽出コード:pwev
2.2 openssl のクロスコンパイル
- openssl をダウンロードします ( https://www.openssl.org/source/ )。ここで使用しているバージョンは openssl1.1.1 です。
(注: 管理の便宜上、ダウンロードされたすべてのソース コードは /home/book/pyarm/zlibarm/ に配置されます) - 解凍: tar -xzvf openssl-1.1.1.tar.gz
- cd openssl-1.1.1
- コンパイル環境を構成します。 ./Configure no-asmshared no-async linux-generic32 --prefix=/home/book/pyarm/opensslarm --cross-compile-prefix=arm-linux-gnueabihf- no-asm in thecross -コンパイル
プロセス コンパイル プロセスを高速化するためにアセンブリ コードは使用されず、
共有によりダイナミック リンク ライブラリが生成されます。
no-async クロスコンパイル ツール チェーンは、GNU C ucontext ライブラリ
–prefix= インストール パスを提供しません (make および make install 後、openssl 関連の include ファイルと lib ファイルはこのディレクトリにあります。インストール ディレクトリは自分で選択できます) –cross-
compile -prefix= クロスコンパイル ツール
linux-generic32 は、32 ビット オペレーティング システムへのクロスコンパイルを意味します。 - 作る
- インストールする
2.3 zlib のクロスコンパイル
- zlib (http://zlib.net/)をダウンロードします。ここで使用しているバージョンは1.2.11です。
- 解凍: tar -xzvf zlib-1.2.11.tar.gz
- cd zlib-1.2.11
- コンパイラを設定します:export CC=arm-linux-gnueabihf-gcc (zlib の configure にはコンパイラを設定するオプションがないため、ここで環境変数を設定します)
- コンパイル環境を構成します: ./configure --prefix=/home/book/pyarm/zlibarm --enable-shared
- 作る
- インストールする
2.4 libffi のクロスコンパイル
- libffi をダウンロードします ( https://sourceware.org/libffi/ )。ここで使用しているバージョンは3.2.1です
- 解凍: tar xvzf libffi-3.2.1.tar.gz
- cd libffi-3.2.1
- 構成環境:./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --build=x86_64-linux-gnu target=arm-linux-gnueabihf --enable-shared --prefix= /ホーム/本/pyarm/lifffiarm
- 作る
- インストールする
2.5 Python のクロスコンパイル
-
Python をダウンロードします ( https://www.python.org/downloads/source/ )。ここで使用しているバージョンは3.6.9です
-
解凍: tar xvf Python-3.6.9.tgz
-
cd Python-3.6.9
-
mkdir /home/book/arm-python (Python のコンパイルは上記ライブラリに依存するため、ここにディレクトリを追加すると、上でコンパイルした include と lib がこのディレクトリに移動されます)
-
上記でコンパイルした関連ライブラリのヘッダー ファイルとリンク ライブラリを /home/book/arm-python cp -rfp /
home/book/pyarm/zlibarm/* /home/book/arm-python cp
-rfp /home/ bookにコピーします。 /pyarm/lifffiarm/* /home/book/arm-python
cp -rfp /home/book/pyarm/opensslarm/* /home/book/arm-python -
設置CFLAGS:CFLAGS="-I /home/book/arm-python -I /home/book/arm-python/include/python3.6m -L /home/book/arm-python/lib"
-
LDFLAGS を設定します: LDFLAGS="-L /home/book/arm-python/lib"
-
vi Modules/Setup.dist 内の関連ライブラリのヘッダー ファイルとライブラリ ファイルを変更します。
注: 上の図からわかるように、設定したライブラリへのパスは絶対パスなので、後でコンパイルしたファイルを開発ボードにパッケージ化するときに、それらのファイルも /home/book/arm-python に配置する必要があります。開発ボードのディレクトリ (ない場合は自分で作成できます)
(理由: Python 仮想環境は Python コンパイラの絶対パスを記録するため、他のホストで Python 仮想環境を実行する場合、仮想環境はPython コンパイラはこの絶対パスで引き続き検索されます。そのため、開発ボード上に同じディレクトリを作成する必要があります。そうしないと、ファイルやモジュールが見つからないなどのエラーが発生します) -
./configure CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib --host=arm-linux-gnueabihf -- build=x86_64-linux-gnu --target=arm-linux-gnueabihf --disable-ipv6 ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=yes --prefix=/home/book/arm-python --enable-shared --without-ensurepip
-
作る
-
インストールする
3. Linux開発ボードへの移植
- arm-python ディレクトリを圧縮します: cd /home/book tar cvf arm-python.tar arm-python
- FileZilla などのツールを使用して、arm-python.tar を開発ボードの /home/book ディレクトリに転送します。
- 解凍: tar xvf arm-python.tar
概要: 上記の手順の後、Python の移植は完了しました。ここで cd /home/book/arm-python/bin を実行し、次に ./python3 を実行して Python インターフェース プログラミングに入ることができます。 Python インターフェイスを終了するには、exit() を使用します。コマンド ラインに戻ります。
4. ubuntu の Qt プラットフォームでデモ検証を作成する
- Qt で新しいプロジェクトを作成します-----ここで選択したテンプレートは Application (Qt) です-----名前: py_test、作成パスは /home/book/QT/my_qt/qt_python----- -behind いくつかのステップがデフォルト設定されています -----最後にクロスコンパイル ツール チェーンを確認します ----終了。
- 新しいファイルを作成します。[Python]、[Python ファイル] を選択します -- 名前: test_pyfile.py、パスを変更する必要はありません -- これで完了です。(作成後、プロジェクトのその他のファイルに test_pyfile.py ファイルが表示されます)
- 次のコードを test_pyfile.py ファイルに追加します: (主な関数は、パラメーター a を通じて文字列を渡し、連結された文字列 b を返すことです)
def testpyfile(a):
b = a+'jiayou'
return b
# 这里必须空两行:
# python编码规范:类与类,类与函数,函数与函数之间空两行)
print(testpyfile("111"))
- Python 関連のライブラリ ファイルとヘッダー ファイルを .pro ファイルにインポートします。
INCLUDEPATH += \
-I /home/book/arm-python/include/python3.6m/ \
-I /home/book/arm-python/include \
-I /home/book/arm-python/include/openssl
LIBS += \
-L /home/book/arm-python/lib/ -lpython3.6m \
-L /home/book/arm-python/lib/ -lssl \
-L /home/book/arm-python/lib/ -lcrypto \
-L /home/book/arm-python/lib/ -lz \
- main 関数に次のコードを追加します。
#include "mainwindow.h"
#include <QApplication>
#include "Python.h" //引入python头文件
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Py_Initialize(); // 初始化Python
PyObject *pModule = nullptr;
PyObject *pLoadFunc = nullptr;
PyObject *pArgs = nullptr;
PyObject *pReturn = nullptr;
PyObject *str = nullptr;
const char *bytes = nullptr;
if(!Py_IsInitialized())
{
qDebug()<<"inititalize failed";
return -1;
}
else
qDebug()<<"inititalize success";
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('/home/book/QT/my_qt/qt_python/py_test')");
pModule = PyImport_ImportModule("test_pyfile");
if(!pModule)
{
PyErr_Print();
qDebug()<<"not loaded module";
return -1;
}
else
qDebug()<<"load module success";
pLoadFunc = PyObject_GetAttrString(pModule, "testpyfile");
if(!pLoadFunc)
{
PyErr_Print();
qDebug()<<"not loaded pLoadFunc";
return -1;
}
else
qDebug()<<"load pLoadFunc success";
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0 , Py_BuildValue("s", "xuheqing"));
pReturn = PyObject_CallObject(pLoadFunc, pArgs);
if(!pReturn)
{
qDebug()<<"no return value";
return -1;
}
str = PyObject_Str(pReturn);
bytes = PyUnicode_AsUTF8(str);
qDebug()<<bytes;
Py_Finalize();// 关闭 Python 脚本解释器
return a.exec();
}
注: 絶対パスは、自分で作成した .py ファイルを追加するために PyRun_SimpleString("sys.path.append('/home/book/QT/my_qt/qt_python/py_test')") で使用されるため、開発ボードの /home/book/QT/my_qt/qt_python/py_test ディレクトリにあるファイル (そうでない場合は、自分で作成できます)。そうしないと、開発ボードの実行中にファイル モジュールが見つからないというエラーが発生します。!!
-
ビルドする前に、 sudo vi /home/book/arm-python/include/python3.6m/object.h を以下のように修正します。(QT ではスロットがキーとして定義され、Python3 ではスロットが変数として使用されるため、コンパイル中に競合が発生します。)
-
クロスコンパイル ツールを選択し、py_test プロジェクトを右クリックして [ビルド] をクリックして、arm アーキテクチャで実行できるプログラム py_test を取得します。
-
FileZilla などのツールを使用して、py_test ファイルを開発ボードの /mnt ディレクトリに転送します。最初に chmod +x py_test を実行し、実行可能操作を py_test に追加してから、./py_test に追加します。このとき、次のエラーが表示されます:
./py_test: 共有ライブラリのロード中にエラーが発生しました: libpython3.6m.so.1.0: 共有オブジェクト ファイルを開けません: Norectory
解決策:
①まずコマンドを使用してecho $PATH
、現在の PATH 環境変数を表示します。私の環境変数は / bin:/sbin:/usr/bin:usr/sbin です。プログラムを実行すると、シェルは PATH 変数の値に基づいてプログラムのこれらのパスを自動的に検索します。したがって、export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/book/arm-python/lib
Python関連ライブラリへのパスを追加して実行できます。
(注:これはあくまで方法の一つであり、一時的な修正です。開発ボードを再起動した後、環境変数をリセットする必要があります)
② vi /etc/profile. ファイルの最後に追加されますexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/book/arm-python/lib
。次に、開発ボードを再起動します。/etc/profile の環境変数はすべてのユーザーに対して有効であり、システムの起動時に実行されます。これは、環境変数を永続的に有効にする方法です。 -
演算結果