我似乎无法导入位于"lib-dynload"目录中的任何基本模块。 它们都在那里,但我收到错误:尝试导入它们时"ImportError: No module named X"
。
我检查了我的sys.path
,它包括所有这些模块所在的目录,并且我的 PYTHONHOME 环境变量设置正确。 我对问题可能是什么有点不知所措。 一些背景信息:这是从Python 2.6.6源代码交叉编译的,并安装到带有Angstrom的ARM嵌入式Linux板上。
它之前确实有python,我曾尝试将其位烘焙到图像中,但它缺少很多东西。 在加载我的交叉编译版本之前,我最终尽最大努力清理目录树中与以前的 python 有关的任何内容。
仅尝试导入math
的简单脚本的跟踪:http://pastebin.com/3XgJ3nPR
我在跟踪中没有看到对 math.so
或 mathmodule.so
等文件名的检查,这可能表明共享对象模块已完全关闭——您编译的 Python 版本无法动态加载二进制模块。
更多:查看我最近的 Python 构建config.out
,我看到 Python 正在调查平台是否允许它动态加载以 .so
结尾的二进制模块的几行:
checking for dlopen... yes
checking DYNLOADFILE... dynload_shlib.o
checking MACHDEP_OBJS... MACHDEP_OBJS
这些行在您的交叉编译中说明了什么?
我最近在构建 Python 2.7.13 时遇到了类似的问题,我相信正是这个错误正在为 Python 3 修复,但没有移植回 2。构建过程(setup.py)生成要构建的模块列表,然后减去内置模块列表(sys.builtin_module_names
);但是,setup.py 是使用 python2.7
运行的(从 Makefile),在我的情况下,它选择了系统 (Ubuntu) 二进制文件而不是构建的二进制文件,因此它减去了为 System python 内置的模块(包括运算符和集合),但不是正在构建的模块,因此它们既不是内置的,也不是作为外部模块构建的。
我能够使用错误中的建议,并将源目录中构建的python附加到路径中(并添加来自python2.7 -> python的符号链接)。这之所以有效,是因为我正在多架构 x64 机器上构建 x86 python;如果您正在为另一个系统(如 ARM)构建,则可能需要应用错误中的补丁,以获取构建过程早期的内置模块列表,而不是主机 python。