2011-05-08 54 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。