【发布时间】: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声明了运行时依赖项,因此列出的包在构建时将不可用。尝试将python3和python3-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