如何在本地 Python 项目的 Yocto 配方中安装来自 requirements.txt

我应该有什么:

我希望我的 Yocto 项目为我的 Python 项目构建一个包含所有依赖项的包。该项目必须在生成的只读 sdcard 图像上运行。

它只是应该将所需版本中的所有要求安装到包中。


我没有运气的尝试:

调用pipdo_install():

“找不到 pip/pip3”,即使它在 RDEPENDS 中。 无论如何,我真的很喜欢这种方式。


与inherit pypi:

尝试使用 时inherit pypi,它还会尝试从 pypi 获取我的本地资源(我的 pyton 项目)。而且我总是将要求复制到配方中。这不是我的首选方式。


pip在 pkg_postinst() 中调用:

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


我会去哪里:

当 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图像的最佳方法是什么?


有只小跳蛙
浏览 213回答 3
3回答

慕田峪4524236

我的最新发现: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 as 之外执行此操作python3 setup.py install ${MY_INSTALL_ARGS},所有内容都将正确安装,但在配方中,没有安装任何要求。有一个参数--no-deps,但我没有找到它在哪里设置。我认为可能有一种可能性可以利用 setup.py 中的要求:找出--no-deps在易于安装的 openembedded/poky 层中禁用的位置。创建一个单独的 PYTHON_SITEPACKAGES_DIR将此单独的 PYTHON_SITEPACKAGES_DIR 安装在例如主目录中作为私有 python 模块目录。这样,没有 python 模块会触发冲突。由于我没有时间对此进行试验,因此我现在将为每个需求定义一个配方。

慕少森

你试试安装pip?Debianapt-get install python-pipapt-get install python3-pipCentosyum install python-pip
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python