将 Yocto 与默认使用 python3 的发行版一起使用

Using Yocto with a distribution using python3 by defaults

越来越多的 Linux 发行版默认使用 python 3.x python,但 Yocto 仍然使用 python 2.7。如何将 Yocto 与这些发行版之一一起使用?

Linux 分布缓慢地转移到 Python3 逐个应用程序,通过调整 shebang 行以使用 Python 3.

CentOS 7、Ubuntu 14.4 LTS、Debian Jessy 所有 默认 到 Python2.7 如果您在命令行上键入 python

如果 Yocto 是使用包管理器安装的,它将适应 Linux 发行版上的任何工作,它可以与通用 sheband(加载 python)或明确的(正在加载 python2python2.7.

如果您自己安装 Yocto,它可能无法工作,因为您所在的系统默认为 3 系列的 python,您可以调整 shebang 行来自:

#!/usr/bin/env python

#!/usr/bin/env python2

我假设 python2.7 将在未来几年内可用并可按需安装,即使 python3 成为任何这些发行版的默认设置(就像 python3 在默认情况下未安装时可用。

从源代码安装 Yocto 时你应该考虑的是 运行 它在 virtualenv 中,这样你就可以设置一个干净的环境,这可能需要更多的工作,具体取决于依赖项,但确保为您的应用程序提供干净的工作环境,任何软件包的任何系统更新都不会破坏它。如果你这样做,你的设置甚至可以使用不同于 Linux 发行版提供的 python2.7.X 版本。

Yocto 始终在虚拟环境中运行。但是我找到了一种方法来欺骗它使用 python 2 ,设置默认值 python 并将其包含在 PATH 环境变量中:

$ source oe-init-build-env build
$ mkdir build/python-bin
$ ln -s /usr/bin/python2 build/python-bin/python
$ ln -s /usr/bin/python2-config build/python-bin/python-config
$ export PATH=$(pwd)/build/python-bin:${PATH}

感谢大家的帮助!

这里的规范解决方案是使用 virtualenv 创建一个环境,其中 "python" 是 python 2.

您可以通过覆盖 yocto 创建的主机工具符号链接来修复它。 我设法使用 Shan-x 的修复程序启动了 yocto 构建,但它没有构建成功。

Yocto 为所有食谱提供不同的环境。一些食谱,尤其是来自 meta-openembedded 的食谱需要 hosttools。例如,这些主机工具是 python(然后预计为 python2)。 然后,此主机工具在 build/tmp/hosttools 中进行符号链接,并将其添加到 $PATH.

python -> /usr/bin/python

要将其更改为默认值 python2,只需将符号链接更改为指向 /usr/bin/python2

整个设置:

$ mkdir build/python-bin
$ ln -s /usr/bin/python2 build/python-bin/python
$ ln -s /usr/bin/python2-config build/python-bin/python-config
$ mkdir -p build/tmp/hosttools
$ ln -sf /usr/bin/python2 build/tmp/hosttools/python

自动更改为 python2 添加导出 $PATH 到 sources/poky/oe-init-build-env ,就在获取其他内容之前:

diff --git a/oe-init-build-env b/oe-init-build-env
index e813230a98..c981358577 100755
--- a/oe-init-build-env
+++ b/oe-init-build-env
@@ -47,6 +47,8 @@ if [ -z "$OEROOT" ]; then
 fi
 unset THIS_SCRIPT

+export PATH=$(pwd)/build/python-bin:${PATH}
+
 export OEROOT
 . $OEROOT/scripts/oe-buildenv-internal &&
     TEMPLATECONF="$TEMPLATECONF" $OEROOT/scripts/oe-setup-builddir || {

然后获取环境:

$ source oe-init-build-env build