目的
SBCに何らかの付加価値をつけた(pythonで作成した)ものを
配布するときにソースコードをそのまま渡すことが
何らかの都合で出来ない場合に
cythonを利用してバイナリで配布する。
確認環境
- raspi 4
- ubuntu 22.04
手順
基本的には以下だが、Linux版で失敗と記載があるので
こちらで成功した手順を記載
こちらで実行に成功した手順
soファイルの作成
main以外のコードをsetup.pyに記載してビルド
setup.py
from setuptools import setup, Extension
from Cython.Build import cythonize
setup(
ext_modules = cythonize([
Extension(
"sub_module1",
sources=["sub_module1.py"],
),
Extension(
"sub_module2",
sources=["sub_module2.py"],
),
...
]),
)
python3 setup.py build_ext --inplace
mainファイルを変換
cython --embed -o main.c main.py
mainファイルをコンパイル
aarch64-linux-gnu-gcc -c main.c $(python3-config --cflags)
※コンパイラは当該環境で使用可能なもの
リンク
aarch64-linux-gnu-gcc -o [実行ファイル名] main.o -L. -l:sub_module1.cpython-310-aarch64-linux-gnu.so -l:sub_module2.cpython-310-aarch64-linux-gnu.so $(python3-config --ldflags) -lpython3.10 -Wl,-rpath=. -Wl,-rpath=/usr/lib/aarch64-linux-gnu
ポイントは以下
- pythonのバージョンを指定してpythonライブラリのリンクを行う
- ライブラリはlinuxのライブラリの命名規則に則っていないので直接ファイル名で指定をする(:を使う)
- soファイルのある場所をライブラリパスに含める
※-Wl,-rpath
は念の為つけたが多分要らない
→PYTHONPATHしか見ていない?
実行
PYTHONPATH=${PYTHONPATH}:. ./[実行ファイル名]