Buildroot Python 依赖项 (_sqlite3)

kjn*_*kjn 5 python sqlite dependencies embedded-linux buildroot

完整免责声明:过去 6 周我一直在使用 buildroot。这是我第一次接触嵌入式Linux,因此我还很新手,但已经能够自己解决99%的问题。在很大程度上,这个过程很简单。

因此,当我被困在家里且无法工作时,为了让自己忙碌起来,我一直致力于嵌入式硬件项目。我已经选择了我的硬件,构建了一个原型,学习了 buildroot 基础知识,启动了基本系统,优化了内核配置,为我的硬件构建了一个自定义设备树,到目前为止我很高兴。

与此同时,我一直在桌面上用 python 编写目标应用程序,它依赖于一些库(硬件抽象、通信、显示等),但相对简单。

我已经有了一份构建到我的 buildroot 系统中所需的软件包列表。buildroot 工具在这里使用 scanpypi 工具非常有用:

~/buildroot$ utils/scanpypi diskcache -o package
Run Code Online (Sandbox Code Playgroud)

只需将所有依赖项添加到 /package/config.in 中,就可以在 menuconfig 中选择它们并将其添加到配方中。

问题出现在构建时,对于 python-diskcache 上面的模块,Python 模块的构建失败。

它依赖于一些东西,但其中之一是 slqite3,它已添加为: 核心 python 模块“sqlite module”外部包“python-pysqlite3”库>数据库> sqlite

但是,它在构建时失败:

>>> python-diskcache 4.1.0 Building
Traceback (most recent call last):
File "setup.py", line 5, in <module>
import diskcache
File "/home/buildroot/output/build/python-diskcache-4.1.0/diskcache/__init__.py", line 9, in <module>
from .core import Cache, Disk, EmptyDirWarning, JSONDisk, UnknownFileWarning, Timeout
File "/home/buildroot/output/build/python-diskcache-4.1.0/diskcache/core.py", line 14, in <module>
import sqlite3
File "/home/buildroot/output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/python3.8/sqlite3/__init__.py", line 23, in <module>
from sqlite3.dbapi2 import *
File "/home/buildroot/output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/python3.8/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'
make[1]: *** [package/pkg-generic.mk:269: /home/buildroot/output/build/python-diskcache-4.1.0/.stamp_built] Error 1
make: *** [Makefile:84: _all] Error 2
Run Code Online (Sandbox Code Playgroud)

在寻找解决方案时,似乎 _sqlite3 是 python 外部的 C 模块,用于与 sqlite 数据库通信。它应该与 python 一起安装(使用 3.8),并且应该在 buildroot 中启用核心 sqlite 模块。

讨论1 讨论2

有几个修复程序可以在主机上处理此问题(例如 apt get install libsqlite3-dev 和重新安装/重新配置 python)。显然,这在映像中是不可能的,并且 sqlite 和 python3 安装都是最新版本,并在构建时安装到映像中。

我真的很难理解这个问题或如何解决它。根据讨论我有一些理论,但我不确定。

1) python 在 sqlite 之前安装到映像,因此相应的模块没有 cp 或符号链接到 python 安装。

2)还有一些其他未知的依赖关系在构建时没有得到满足,并且它默默地失败

任何想法或帮助将不胜感激。

谢谢

Arn*_*out 0

问题是构建机器上的 Python 找到了交叉编译的 _sqlite3 模块,它无法加载该模块,因为它适用于错误的架构。

这通常不会发生,因为安装脚本通常不会加载它尝试构建/安装的包。

一种解决方法可能是安装 diskcache 所有依赖项的主机版本,并PYTHONPATH=$(HOST_DIR)/lib/python$(PYTHON3_VERSION_MAJOR)/:$(PYTHON3_PATH)DISKCACHE_ENV. 然而,这很容易导致各种其他损坏。

因此,更好的解决方案是修补 diskcache 的 setup.py 脚本,这样它就不会尝试导入 diskcache 本身。它可能只是为了获取版本号或类似的东西而这样做;这可以通过将版本号移动到一个单独的文件中并加载该文件来解决。