Как создать расширение PyO3 с помощью Yocto/OpenEmbedded?Python

Программы на Python
Anonymous
Как создать расширение PyO3 с помощью Yocto/OpenEmbedded?

Сообщение Anonymous »

У меня есть проект Python/Rust, который использует PyO3 для создания расширения Python, написанного на Rust.
Я настроил его с помощью maturin, и локально он работает нормально - он построит колесо (.whl), внутри которого находится мой код Python и общий объект расширения Rust, как я и ожидал.
Мне нужно скомпилировать это с помощью Yocto (к сожалению, я застрял на Langdale), чтобы поместить его во встроенную корневую файловую систему, и я быстро пришел к выводу, что мне придется отказаться от maturin ради setuptools-rust, поскольку в Yocto Langdale вообще нет поддержки maturin.
Итак, теперь мой проект Rust/Python/PyO3 настроен очень похоже на setuptools-rust пример, и я могу собрать его локально, и сгенерированное колесо будет содержать то, что я ожидал.
Макет каталога:

Код: Выделить всё

.
├── Cargo.lock
├── Cargo.toml
├── MANIFEST.in
├── pyproject.toml
├── python
│   ├── my_project
│   │   └── my_module.py
│   └── tests
│       └── test_my_module.py
└── src
└── lib.rs

Код: Выделить всё

project.toml
(частично):

Код: Выделить всё

[build-system]
requires = ["setuptools>=61.0.0", "setuptools-rust"]
build-backend = "setuptools.build_meta"

[tool.setuptools.packages]
find = { where = ["python"] }

[[tool.setuptools-rust.ext-modules]]
target = "my_project._lib"
path = "Cargo.toml"
binding = "PyO3"
(РЕДАКТИРОВАТЬ: удален setuptools-scm, поскольку версия Langdale < 8, вместо этого используйте MANIFEST.in)

Код: Выделить всё

MANIFEST.in:
include Cargo.toml
recursive-include src *.rs

Код: Выделить всё

Cargo.toml
(частично):

Код: Выделить всё

[lib]
name = "_lib"
crate-type = ["cdylib"]
path = "src/lib.rs"

[dependencies]
pyo3 = "0.22.0"
Рецепт python3-my-project.bb:

Код: Выделить всё

inherit externalsrc
EXTERNALSRC = "${TOPDIR}/../../my_project"

DEPENDS += "  \
python3-tomli-native \
python3-setuptools-rust-native"

inherit python_setuptools_build_meta
РЕДАКТИРОВАТЬ: включение python3-tomli-native исправило ошибку:

Код: Выделить всё

|   File "build/tmp/work/cortexa72-cortexa53-xilinx-linux/my_package/1.0-r0/recipe-sysroot-native/usr/lib/python3.10/site-packages/picobuild/__init__.py", line 93, in __init__
|     pyproject = tomllib.load(f)
| AttributeError: module 'tomli' has no attribute 'load'
При этом создается .rpm, но проверка содержимого показывает, что общая библиотека отсутствует:

Код: Выделить всё

/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/METADATA
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/RECORD
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/WHEEL
/usr/lib/python3.10/site-packages/my_project-0.1.0.dist-info/top_level.txt
/usr/lib/python3.10/site-packages/my_project/__pycache__/my_project.cpython-310.pyc
/usr/lib/python3.10/site-packages/my_project/my_project.py
/usr/lib/python3.10/site-packages/tests/__pycache__/test_my_project.cpython-310.pyc
/usr/lib/python3.10/site-packages/tests/test_my_project.py
(Не знаю, почему этот .whl содержит каталог тестов? Это типично? Возможно, это особенность структуры каталога setuptools-rust.)
Посмотрев в журнал bitbake, я вижу, что используется что-то под названием «picobuild»:

Код: Выделить всё

DEBUG: python3-my-project-1.0-r0 do_compile: Executing shell function do_compile
+ cd build/tmp/work/cortexa72-cortexa53-xilinx-linux/python3-my-project/1.0-r0/python3-my-project-1.0
+ do_compile

+ export _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata
+ _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata
+ python_pep517_do_compile
+ nativepython3 -m picobuild --source /.../build/../../python/my_project --dest /.../build/tmp/work/cortexa72-cortexa53-xilinx-linux/python3-my-project/1.0-r0/dist --wheel
...
Немного покопавшись, я вижу, что примерно в мае 2022 года стандартный интерфейс pypa/build был заменен на picobuild:
https ://patchwork.yoctoproject.org/project/oe-core/cover/20220526171001.4074388-1-ross.burton@arm.com/
Но новое сообщение от января 2023 года, похоже, предполагает что «picobuild» было изменено обратно на «build» (намек на «миграцию»):
https://patchwork.yoctoproject.org/proj ... ore/patch/ 20230112112336.2254765-4-ross.burton@arm.com/#7902
Кто-нибудь знает историю этого? Является ли "picobuild" моей проблемой в том, что он каким-то образом не поддерживает плагин setuptools-rust?

Вместо этого наследование от python_setuptools3_rust python_setuptools_build_meta успешно собирает и упаковывает части Python моего проекта, но расширение Rust (я ожидал увидеть файл .so или .pyd) полностью отсутствует. Я думаю, это связано с тем, что python_setuptools3_rust не использует шаг сборки, совместимый с PEP-517, и напрямую вызывает setup.py bdist_wheel, что пропускает настройку Rust в pyproject.toml.
На этом этапе у меня закончилась документация или примеры, которые могли бы мне помочь. Я немного не понимаю, как действовать дальше.
Очень жаль, что я застрял с Йокто Лэнгдейлом, потому что последний LTS, Scarthgap, похоже, уже созрел< /code> поддержка.

Подробнее здесь: https://stackoverflow.com/questions/788 ... enembedded

Вернуться в «Python»