交叉编译的Python无法找到基本模块(如math、operator等)

6
我似乎无法导入位于“lib-dynload”目录中的任何基本模块。它们都在那里,但是当我尝试导入它们时,我会收到错误:“ImportError:找不到模块X”。我检查了我的sys.path,并包括所有这些模块所在的目录,我的PYTHONHOME环境变量设置正确。我有点不知道问题可能是什么。一些背景信息:这是从Python 2.6.6源代码交叉编译并安装到一个带有Angstrom的ARM嵌入式Linux板上。它以前有python,我曾经试图将其编入映像中,但缺少了很多东西。最终,我尽力清理了与先前python有关的任何目录树,然后加载了我的交叉编译版本。一个简单的脚本尝试导入math的strace:http://pastebin.com/3XgJ3nPR
2个回答

2

我在这个跟踪记录中看不到检查文件名如math.somathmodule.so的内容,这可能表明共享对象模块被完全关闭了 - 也就是说,您编译的Python版本无法动态加载二进制模块。

更多信息: 查看我最近构建的Python的config.out时,我看到有几行Python正在调查平台是否允许它动态加载以.so结尾的二进制模块:

checking for dlopen... yes
checking DYNLOADFILE... dynload_shlib.o
checking MACHDEP_OBJS... MACHDEP_OBJS

你的交叉编译中这些行是什么意思?


你知道需要设置哪个标志或变量才能使其以这种方式编译吗?我可以检查make/setup/configure的结果。 - Jon
不会的。当我在Ubuntu上为i386编译Python时,它会自动决定是否能够加载共享对象。也许它会检查dlopen()系统调用?是的,看起来是这样的 - 我会更新我的答案。 - Brandon Rhodes
它在几个地方进行检查。相关部分:http://pastebin.com/UQ2ZsteE。结果是失败。这一定是问题所在,谢谢。我会研究如何解决这个问题,有什么建议吗?FYI:最近我决定切换内核和相应的工具链,之前的工具链可以交叉编译Python而没有任何问题。 - Jon
没有,我脑海中没有推荐(刚醒来,否则我会更快地回复)——看起来你正在使用的libc知道*dlopen()的一些信息,因为错误比“未知函数”更有趣;这让我有希望,如果正确编译和配置,平台可以提供给你该函数。但显然,当前设置下dlopen()并不完全可用。 - Brandon Rhodes

0

我最近在构建Python 2.7.13时遇到了类似的问题,我认为这是this bug,它正在为Python 3修复,但没有移植回2。构建过程(setup.py)生成要构建的模块列表,然后减去内置模块列表(sys.builtin_module_names); 然而,setup.py是使用python2.7运行的(从Makefile),在我的情况下,它选择了系统(Ubuntu)二进制文件而不是已构建的二进制文件,因此它减去了对于系统Python(包括operator和collections)而言是内置的模块,但对于正在构建的模块来说却不是内置的也不是外部模块。

我能够使用该错误的建议,并将源目录中构建的Python前置到路径中(并添加一个符号链接从python2.7 -> python)。这起作用是因为我正在多架构x64机器上构建x86 Python;如果您正在为其他系统(如ARM)构建,则可能需要应用该错误的补丁,以便从构建过程的早期获取内置模块列表而不是主机Python。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接