2
votes

Comment installer des dépendances depuis requirements.txt dans une recette Yocto pour un projet Python local

Ce que je devrais avoir:

Je veux que mon Yocto Project construise un package pour mon projet Python avec toutes les dépendances à l'intérieur. Le projet doit sortir de la boîte sur l'image résultante de la carte SD en lecture seule.
Il devrait simplement installer toutes les exigences de la version requise du paquet.

Ce que j'ai essayé sans chance:

Appel de pip dans do_install (): h3>

"pip / pip3 est introuvable", même s'il est dans RDEPENDS. Quoi qu'il en soit, je préfère vraiment cette façon.

Avec inherit pypi :

Lorsque vous essayez avec inherit pypi code>, il essaie d'obtenir également mes sources locales (mon projet pyton) de pypi. Et je dois toujours copier les exigences dans la recette. Ce n'est pas ma méthode préférée .

Appeler pip dans pkg_postinst ():

Il essaie d'installer les modules en premier démarre et échoue, car le système n'a pas de connexion Internet et il s'agit d'un système en lecture seule. Il doit sortir de la boîte sans installation au premier démarrage. Fait ses affaires trop tard .

Où je vais me déplacer:

Il ne devrait pas être nécessaire de changer quoi que ce soit dans les recettes lorsque quelque chose change dans les exigences .txt.

Informations générales

Je travaille avec Yocto Rocko dans un environnement Linux.
Dans le système hôte, aucun pip n'est installé. Je veux exécuter celui-ci installé à partir de RDEPENDS dans le système cible.

Construire le package (uniquement cette recette) avec:

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.

Construire toute la sdcard image:

| /*/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 ...

La recette:

myproject.bb (lignes pertinentes):

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/*"

Erreurs résultantes:

On s'attend à installer les modules listés de requirements.txt dans le package myProject, afin que l'application python s'exécute directement sur l'image sdcard en lecture seule résultante.

Avec pip, J'obtiens:

bitbake myProject-image-base

Lors de l'utilisation de pypi:

bitbake myproject

=> Mais il ne devrait pas récupérer mon projet, car il est déjà local et nulle part éloigné.

Des idées? Quel serait le meilleur moyen d'atteindre une image sdcard prête à l'emploi sans avoir à changer de recette lorsque le fichier requirements.txt change?


5 commentaires

Je ne suis pas familier avec Yocto, mais la syntaxe a attiré mon attention, elle est très similaire à l'EAPI de Gentoo. Dans les ebuilds de Gentoo, RDEPENDS déclare les dépendances d'exécution, donc les paquets qui y sont listés ne seront pas disponibles au moment de la construction. Essayez plutôt d'ajouter python3 et python3-pip à la liste DEPENDS .


En ce qui concerne l'échec de l'extracteur, pip install -r requirements.txt essaiera de télécharger tous les packages répertoriés dans le fichier et de les installer. Si vous ajoutez myproject à la liste des packages, cela ne fera aucune exception. Vous pouvez à la place demander à pip d'installer directement depuis le répertoire source: pip install path / to / dir , où path / to / dir est le un contenant le script setup.py du projet.


Bien que je puisse aussi me tromper complètement avec mes hypothèses :-)


@hoefling: non, myProject ne fait pas partie des packages listés dans requirements.txt. Mais requirements.txt fait partie de myProject. Tous les packages de la liste doivent vraiment être téléchargés.


@hoefling: J'ai aussi essayé de déclarer pip dans DEPENDS, mais cela a le même effet. Je suppose qu'il recherche pip dans le système hôte de cette façon je l'ai utilisé? Ai-je tort?


3 Réponses :


-3
votes

Vous essayez d'installer pip?

Debian

yum install python-pip

Centos

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


1 commentaires

Je sais comment installer pip, mais j'aime éviter d'installer pip dans le système hôte mais en utilisant celui-ci qui est emballé au moment de la construction, si cela est possible.



2
votes

Vous devez utiliser RDEPENDS _ $ {PN} pour prendre soin de vos dépendances pour votre application dans la recette.

Par exemple, en supposant que votre application python a besoin de aws-iot-device -sdk-python , vous devez l'ajouter à RDEPENDS dans la recette. Dans votre cas, ce serait comme ceci:

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

Voici le lien montrant les modules Python pris en charge par OpenEmbedded Layer. https://layers.openembedded.org/layerindex/branch/master / layer / meta-python /

Si les modules dont vous avez besoin ne sont pas là, vous devrez probablement créer des recettes pour les modules.


0 commentaires

0
votes

Mes dernières découvertes:

Yocto / bitbake semble supprimer l'interprétation des exigences, car cela rompt la dépendance automatique en résolvant ce qui pourrait conduire à des conflits.
Raison: Les modules requis de setup.py ne seraient pas stockés en tant que packages indépendants, mais dans le cadre de mon package. Donc, bitbake ne sait pas à propos de ces modules ce qui pourrait entrer en conflit avec d'autres packages qui nécessitent probablement les mêmes modules dans différentes versions.

Ce qu'il y avait dans ma recette:

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}
}

Si j'exécute ceci en dehors de bitbake en tant que python3 setup.py install $ {MY_INSTALL_ARGS} , tout sera installé correctement, mais dans la recette, aucune exigence n'est installée. Il existe un paramètre --no-deps , mais je n'ai pas trouvé où il est défini.

Je pense qu'il pourrait y avoir une possibilité d'exploiter les exigences de l'installation. py:

  • Découvrez où désactiver --no-deps dans la couche openembedded / poky pour easy_install.
  • Création d'un PYTHON_SITEPACKAGES_DIR distinct
  • Installez ce PYTHON_SITEPACKAGES_DIR séparé par exemple dans le répertoire home en tant que répertoire de modules python privé.

De cette façon, aucun module python ne déclencherait de conflit.

Comme je n'ai pas le temps d'expérimenter cela, je définirai maintenant une recette par exigence. p >


0 commentaires