如何在本地Python项目的Yocto食谱中从requirements.txt安装依赖项

时间:2019-01-07 19:23:57

标签: python pip yocto pypi requirements.txt

我应该拥有的东西:

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

我没有运气的尝试:

在do_install()中调用pip

“未找到pip / pip3”,即使在RDEPENDS中也是如此。 无论如何,我真的更喜欢这种方式。

使用inherit pypi

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

在pkg_postinst()中调用pip

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

我要去的地方:

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

产生的错误:

预期将要求文件中列出的模块安装到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,因为它已经是本地的并且不在远程。

有什么想法吗?在requires.txt更改时,无需更改配方即可获得可立即使用的sdcard图像的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您应该使用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/

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

答案 1 :(得分:0)

我的最新发现:

Yocto / bitbake似乎抑制了对需求的解释,因为这破坏了自动解决依赖关系的解决方案,可能会导致冲突。
原因:setup.py中所需的模块不会存储为独立程序包,而是作为我程序包的一部分存储。因此,bitbake不了解此模块,哪些模块可能与其他需要不同版本的相同模块的软件包发生冲突。

我的食谱是什么

->whereAnd($decision ? 's.decision = true' : 'true=true' )

如果我在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},但是我没有找到它的设置位置。

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

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

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

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

答案 2 :(得分:-1)

您尝试安装点子吗?

Debian

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

Centos

yum install python-pip