我希望Yocto项目为我的Python项目构建一个包,其中包含所有依赖项。该项目必须在生成的只读sdcard映像上开箱即用。
只需将所有要求的必需版本安装到软件包中即可。
pip
:“未找到pip / pip3”,即使在RDEPENDS中也是如此。 无论如何,我真的更喜欢这种方式。
inherit pypi
:尝试使用inherit pypi
时,它还会尝试从pypi获取我的本地资源(我的pyton项目)。而且我总是要将要求复制到配方中。 这不是我的首选方式。
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图像的最佳方法是什么?
答案 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中的要求:
--no-deps
的位置以进行easy_install。 这样,没有python模块会触发冲突。
由于我没有时间进行试验,因此我现在将为每个需求定义一个配方。
答案 2 :(得分:-1)
您尝试安装点子吗?
Debian
apt-get install python-pip
apt-get install python3-pip
Centos
yum install python-pip