【问题标题】:How to install dependencies from requirements.txt in a Yocto recipe for a local Python project如何在本地 Python 项目的 Yocto 配方中安装 requirements.txt 的依赖项
【发布时间】:2019-06-02 11:33:38
【问题描述】:

我应该拥有什么:

我希望我的 Yocto 项目为我的 Python 项目构建一个包,其中包含所有依赖项。该项目必须在生成的只读 sdcard 图像上用完。
它只需将所需版本中的所有要求安装到包中。

我没有运气的尝试:

在do_install()中调用pip

“pip/pip3 is not found”,即使它在 RDEPENDS 中。 无论如何,我真的更喜欢这种方式。

inherit pypi:

当尝试使用inherit pypi 时,它也会尝试从 pypi 获取我的本地资源(我的 pyton 项目)。而且我总是把要求复制到食谱上。 这不是我喜欢的方式

在 pkg_postinst() 中调用pip

它尝试在第一次启动时安装模块并失败,因为系统没有互联网连接并且它是一个只读系统。它必须开箱即用,无需在首次启动时安装。 迟到了

我要去哪里:

当 requirements.txt 中的某些内容发生更改时,应该不需要更改食谱中的任何内容。

背景资料

我正在 Linux 环境中使用 Yocto Rocko。
在主机系统中,没有安装 pip。我想在目标系统中运行从 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/*"

导致的错误:

预计将列出的模块从 requirements.txt 安装到 myProject 包中,以便 python 应用程序将直接在生成的只读 sdcard 映像上运行。

使用 pip,我得到:

| /*/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,因为它已经是本地的,而且没有远程。

有什么想法吗?当 requirements.txt 更改时,无需更改配方即可获得即用型 sdcard 映像的最佳方法是什么?

【问题讨论】:

  • 我对 Yocto 不熟悉,但语法引起了我的注意,它与 Gentoo 的 EAPI 非常相似。在 Gentoo 的 ebuilds 中,RDEPENDS 声明了运行时依赖项,因此列出的包在构建时将不可用。尝试将python3python3-pip 添加到DEPENDS 列表中。
  • 对于 fetcher 失败,pip install -r requirements.txt 会尝试下载文件中列出的所有包并安装它们。如果将myproject 添加到包列表中,它也不例外。您可以改为指示pip 直接从源目录安装:pip install path/to/dir,其中path/to/dir 是包含项目setup.py 脚本的目录。
  • 虽然我的假设也可能完全错误:-)
  • @hoefling:不,myProject 不属于 requirements.txt 中列出的包的一部分。但是 requirements.txt 是 myProject 的一部分。确实应该下载列表中的所有包。
  • @hoefling:我也尝试在 DEPENDS 中声明 pip,但效果相同。我假设它以我使用它的方式在主机系统中搜索 pip?我错了吗?

标签: python pip yocto pypi requirements.txt


【解决方案1】:

您应该使用RDEPENDS_${PN} 来处理配方中您的应用程序的依赖项。

例如,假设您的 python 应用程序需要aws-iot-device-sdk-python 模块,您应该将其添加到配方中的RDEPENDS。在你的情况下,它会是这样的:

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

这里是显示 OpenEmbedded Layer 支持的 Python 模块的链接。 https://layers.openembedded.org/layerindex/branch/master/layer/meta-python/

如果您需要的模块不存在,您可能需要为这些模块创建配方。

【讨论】:

  • 我发现这个脚本PiP2Bitbake 用于生成所需食谱的脚本非常有用
【解决方案2】:

我的最新发现:

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

如果我在 bitbake 之外以python3 setup.py install ${MY_INSTALL_ARGS} 执行此操作,所有将正确安装,但在配方中,没有安装任何要求。 有一个参数--no-deps,但是没找到在哪里设置的。

我认为有一种可能性可以利用 setup.py 中的要求:

  • 找出在 openembedded/poky 层中禁用 --no-deps 的位置以进行 easy_install。
  • 创建一个单独的 PYTHON_SITEPACKAGES_DIR
  • 在主目录中安装这个单独的 PYTHON_SITEPACKAGES_DIR 作为私有 python 模块目录。

这样,没有python模块会触发冲突。

由于我没有时间对此进行试验,我现在将为每个需求定义一个配方。

【讨论】:

    【解决方案3】:

    你尝试安装 pip 吗?

    Debian

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

    Centos

    yum install python-pip
    

    【讨论】:

    • 我知道如何安装 pip,但我希望避免在 主机系统 中安装 pip,而是使用构建时打包的 pip,如果可能的话。
    猜你喜欢
    • 2019-05-24
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2018-10-27
    • 2019-04-29
    相关资源
    最近更新 更多