2011-05-08 12 views
5

我似乎无法导入位于“lib-dynload”目录中的任何基本模块。他们都在那里,但我试图导入它们时出现错误:"ImportError: No module named X"交叉编译的Python无法找到基本模块(数学,运算符等)

我检查了我的sys.path,它包含所有这些模块所在的目录,并且我的PYTHONHOME环境变量设置正确。我对这个问题可能会有点不知所措。一些背景信息:这是从Python 2.6.6源代​​码交叉编译并安装到带有Angstrom的ARM嵌入式Linux板上。

它确实在那里有python,我试图把它烧成图像,但它缺少很多东西。我最终在加载交叉编译版本之前尽我所能清理与前一个python有关的任何目录树。

,仅仅尝试导入math一个简单的脚本的strace的:http://pastebin.com/3XgJ3nPR

回答

2

我认为没有检查在该跟踪像math.somathmodule.so文件名,其可能指示共享对象模块被完全关闭 - 即您编译的Python版本无法动态加载二进制模块。

更多:看在config.out从我最近的Python构建,我看到几行文字,其中Python是调查该平台是否会让它动态加载结束.so二进制模块:

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

什么你的交叉编译中有这些行吗?

+0

你会碰巧知道要设置什么标志或变量来编译这种方式吗?我可以检查make/setup/configure结果。 – Jon 2011-05-08 04:10:41

+0

不 - 当我在Ubuntu上为i386编译Python时,它自动决定它能够加载共享对象。也许它会检查'dlopen()'系统调用?是的,它看起来像它 - 我会更新我的答案。 – 2011-05-08 04:29:43

+0

它在几个地方检查它。相关部分:http://pastebin.com/UQ2ZsteE。结果是失败。这一定是问题,谢谢。我会研究如何解决这个问题,任何建议? FYI:我决定最近切换内核和相应的工具链,以前的工具链交叉编译python没有任何问题。 – Jon 2011-05-08 05:09:25

0

我最近运行了一个类似的问题,构建Python 2.7.13,我相信它是this bug,它正在为Python 3修复,但没有移植回2.构建过程(setup.py)生成一个列表模块构建,然后减去内置模块列表(sys.builtin_module_names);然而,使用python2.7运行setup.py(来自Makefile),在我的例子中,它选择了系统(Ubuntu)二进制文件而不是构建的二进制文件,所以它从系统python中减去内置的模块(包括运算符和集合),但不适用于正在构建的集合,因此它们既不内置也不构建为外部模块。

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