Кажется, что-то не так с используемой цепочкой инструментов или с тем, как вы запускаете скрипт конфигурации Python.
В любом случае невозможно выполнить отладку, не увидев точную настройку, поэтому я Здесь я начну с нуля.
Я сейчас документирую похожий проект: Разработка Raspberry Pi C ++ .
Набор инструментов
Набор инструментов в raspberrypi/tools
хранилище довольно старое. Обычно я просто создаю новый, используя Crosstool-NG (именно так были построены raspberrypi/tools
наборы инструментов, IIR C).
Я использовал armv8-rpi3-linux-gnueabihf
образец .
Конечно, вы можете построить его самостоятельно, но это может занять довольно много времени, поэтому вы также можете скачать тот, который я построил из Docker Hub (см. Позже).
Вы можете найти больше информации о том, как это было собрано здесь: Подробная информация о настройке и сборке наборов инструментов .
Компиляция Python для системы сборки
Для кросс-компиляции Модуль Python, вам нужна одна и та же версия Python дважды: один раз для вашей системы сборки (компьютер, на котором вы строите) и один раз для хост-системы (Raspberry Pi, для которого вы собираете).
Оба будут скомпилированы из исходного кода, чтобы гарантировать, что они абсолютно одинаковой версии.
Сборка Python будет просто использоваться для кросс-компиляции хоста Python, поэтому мы не будут включать оптимизации и дополнительные модули.
Это скрипт, который я использовал: python-build.sh
Вам нужны OpenSSL, Zlib и libffi, чтобы pip
работал. Я также собрал их из исходного кода, но вы, конечно, можете установить их, используя менеджер пакетов (вам нужны версии -dev
).
Опять же, вы можете найти скрипты установки, которые я использовал здесь .
Кросс-компиляция Python для хост-системы
Прежде чем вы сможете кросс-компилировать Python для Raspberry Pi, вам придется кросс-компилировать его зависимости. Подробное объяснение можно найти здесь: Кросс-компиляция зависимостей .
Вы можете найти скрипты в той же папке на GitHub, на который я ссылался ранее, например, python.sh
.
Есть некоторые предостережения при кросс-компиляции, вам нужен pkg-config
с правильным префиксом , который ищет необходимые библиотеки в sys root вашей кросс-компиляции вместо в папках библиотеки вашей системы сборки. Вы также должны указать каталоги включения и папки библиотеки при вызове скрипта настройки.
Все это обрабатывается этим Dockerfile и скриптами в одной папке.
Crossenv
Самый простой способ кросс-компиляции Python модулей - использовать Crossenv . Инструкции можно найти в README на странице GitHub.
Когда все настроено, вы можете запустить python setup.py bdist_wheel
.
Пример
В качестве примера вы можете выполнить следующие шаги, чтобы скомпилировать простой модуль Python, используя Cython:
1. Вытащите набор инструментов и кросс-скомпилированный файл Python из Docker hub
Это изображение, которое содержит набор инструментов кросс-компиляции, собственный и кросс-скомпилированный Python, а также Crossenv.
docker pull tttapa/rpi3-armv8-python-opencv-cross
2. Создайте файл Python для компиляции и setup.py
для его сборки
Создайте эти два файла:
helloworld.py
print("Hello, World")
setup.py
from setuptools import setup
from Cython.Build import cythonize
from sys import version_info
setup(
name='helloworld',
version='0.0.1',
ext_modules = cythonize("helloworld.py", language_level=version_info[0])
)
3. Создайте сценарий, который создает модуль Python
Этот сценарий будет выполняться внутри контейнера Docker.
build. sh
#!/usr/bin/env bash
set -e
cd /tmp/workdir
source "$HOME/crossenv/bin/activate"
build-pip install cython
cross-pip install wheel
python setup.py bdist_wheel
4. Запустите контейнер Docker и соберите модуль.
Запустите следующую команду в той же папке, где вы создали три файла.
docker run --rm -v "$PWD:/tmp/workdir" \
tttapa/rpi3-armv8-python-opencv-cross \
bash "/tmp/workdir/build.sh"
Когда сборка будет завершена, вы увидите файл dist/helloworld-0.0.1-cp38-cp38-linux_arm.whl
, который вы можете установить с помощью pip install helloworld-0.0.1-cp38-cp38-linux_arm.whl
на Raspberry Py. Вы также найдете файл helloworld.c
, сгенерированный Cython.
Чтобы запустить его, вам, вероятно, придется установить кросс-скомпилированные библиотеки и сам Python на RPi. Вы можете сделать это, скопировав все содержимое ~/RPi-staging
(внутри контейнера Docker) в папку root Pi /
.
.