Как установить зависимости из needs.txt в рецепте Yocto для локального проекта Python - PullRequest
0 голосов
/ 07 января 2019

Что у меня должно быть:

Я хочу, чтобы мой проект Yocto создал пакет для моего проекта Python со всеми зависимостями внутри. Проект должен работать из коробки на полученном образе SDCAD только для чтения.
Он просто должен установить все требования требуемой версии к пакету.

Что я попробовал без удачи:

Вызов pip в do_install ():

"pip / pip3 не найден", даже в RDEPENDS. Во всяком случае, я действительно предпочитаю этот путь.

С inherit pypi:

При попытке с inherit pypi он также пытается получить мои локальные источники (мой проект Pyton) от Pypi. И я всегда должен копировать требования к рецепту. Это не мой любимый способ .

Вызов pip в pkg_postinst ():

Он пытается установить модули при первом запуске и завершается неудачно, потому что система не подключена к Интернету и доступна только для чтения. Он должен работать из коробки без установки при первой загрузке. Делает свои вещи до поздна .

Где я обойду:

Не должно быть необходимости что-либо менять в рецептах, когда что-то меняется в require.txt.

Справочная информация

Я работаю с Yocto Rocko в среде Linux.
В Хостсистеме пипс не установлен. Я хочу запустить этот, установленный из RDEPENDS в целевой системе.

Сборка пакета (только этот рецепт) с:

bitbake myproject

Создание всего изображения SDCARD:

bitbake myProject-image-base

Рецепт:

myproject.bb (соответствующие строки):

RDEPENDS_${PN} = "python3 python3-pip"

APP_SOURCES_DIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../../../../app-sources')}"

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

SRC_URI = " \
    file://${APP_SOURCES_DIR}/myProject \
    ...
"

inherit allarch  # tried also with pypi and setuptools3 for the pypi way.

do_install() {  # Line 116
    install -d -m 0755 ${D}/myProject
    cp -R --no-dereference --preserve=mode,links -v ${APP_SOURCES_DIR}/myProject/* ${D}/myProject/
    pip3 install -r ${APP_SOURCES_DIR}/myProject/requirements.txt
    # Tried also python ${APP_SOURCES_DIR}/myProject/setup.py install
}

# Tried also this, but it's no option because the data MUST be included in the Package:
# pkg_postinst_${PN}() {
#     #!/bin/sh -e
#     pip3 install -r /myProject/requirements.txt
# }

FILES_${PN} = "/myProject/*"

Результирующие ошибки:

Предполагается установить перечисленные модули из needs.txt в пакет myProject, чтобы приложение python работало непосредственно с полученным образом SDCard только для чтения.

С пипсами я получаю:

| /*/tmp/work/*/myProject/0.1.0-r0/temp/run.do_install: 116: pip3: not found
| WARNING: exit code 127 from a shell command.
| ERROR: Function failed: do_install ...

При использовании pypi:

404 Not Found
ERROR: myProject-0.1.0-r0 do_fetch: Fetcher failure for URL: 'https://files.pythonhosted.org/packages/source/m/myproject/myproject-0.1.0.tar.gz'. Unable to fetch URL from any source.

=> Но он не должен извлекать myProject, поскольку он уже локальный и нигде не удаленный.

Есть идеи? Каков наилучший способ получения готового к использованию образа SDCard без необходимости менять рецепты при изменении require.txt?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Вы должны использовать RDEPENDS_${PN}, чтобы позаботиться о зависимости вашего приложения в рецепте.

Например, если вашему приложению python требуется модуль aws-iot-device-sdk-python, вы должны добавить его к RDEPENDS в рецепте. В вашем случае это было бы так:

RDEPENDS_${PN} = "python3 \
                  python3-pip \
                  python3-aws-iot-device-sdk-python \
                 "

Вот ссылка, показывающая модули Python, поддерживаемые OpenEmbedded Layer. https://layers.openembedded.org/layerindex/branch/master/layer/meta-python/

Если необходимых вам модулей нет, вам, вероятно, потребуется создать рецепты для модулей.

0 голосов
/ 15 января 2019

Мои новейшие находки:

Yocto / bitbake, похоже, подавляет интерпретацию требований, потому что это нарушает автоматическую зависимость, разрешающую то, что может привести к конфликтам.
Причина: Необходимые модули из setup.py будут храниться не как независимые пакеты, а как часть моего пакета. Таким образом, bitbake не знает об этих модулях, что может конфликтовать с другими пакетами, которым, вероятно, требуются одинаковые модули в разных версиях.

Что было в моем рецепте:

MY_INSTALL_ARGS = "--root=${D} \
    --prefix=${prefix} \
    --install-lib=${PYTHON_SITEPACKAGES_DIR} \
    --install-data=${datadir}"

do_install() {
    PYTHONPATH=${PYTHON_SITEPACKAGES_DIR} \
    ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install ${MY_INSTALL_ARGS}
}

Если я выполню это вне битбейка как python3 setup.py install ${MY_INSTALL_ARGS}, все будет установлено правильно, но в рецепте не установлены никакие требования. Есть параметр --no-deps, но я не нашел, где он установлен.

Я думаю, что может быть одна возможность использовать требования из setup.py:

  • Узнайте, где отключить --no-deps в слое openembedded / poky для easy_install.
  • Создание отдельного PYTHON_SITEPACKAGES_DIR
  • Установите этот отдельный PYTHON_SITEPACKAGES_DIR, например, в домашний каталог как частные модули python.

Таким образом, ни один модуль Python не вызовет конфликт.

Поскольку у меня нет времени экспериментировать с этим, сейчас я определю один рецепт для каждого требования.

0 голосов
/ 07 января 2019

Вы пытаетесь установить pip?

Debian

apt-get install python-pip
apt-get install python3-pip

Centos

yum install python-pip
...