解決 Linux 手動編譯 Python 3 出現:no module named ‘…’

今天早上要在 LinuxMint 上面裝 Python 3,LinuxMint 雖然有 apt-get install python3,心血來潮決定自己手動編譯最新版本試試看,到 Python 官方 > Download > Python 3.3.3 compressed source tarball (for Linux, Unix or Mac OS X),下載了 Python-3.3.3.tgz,接著把他解壓縮出來後,chmod 設定一下資料夾權限,接著就開始進行手動編譯作業。

參考 README 文件提供的安裝步驟:

  1. ./configure
  2. make
  3. make test
  4. sudo make install

建議可以先 chmod 777 * 整個目錄,不然會有權限不足的問題(即使使用 root 身分)。

Python-3.3.3 # ./configure creating Modules/Setup creating Modules/Setup.local creating Makefile

接下來

Python-3.3.3 # make

make 測試了一堆項目,執行的過程發現有些項目會出現類似:

test_idle skipped — No module named ‘_tkinter’ test_idle skipped — No module named ‘…’

原本不以為意,不過把這訊息丟到 Google search 去,發現不少人遇到這個問題過,簡單的說就是 Python 3 有功能會需要相依這些軟體,如果不解決這問題的話,到時候有需要使用的時候,必須要重新編譯(ImportError: No module named … 的元兇),所以就開始著手解決問題。

舉 test_idle skipped — No module named ‘readline’ 這條訊息來說,缺了 readline 一定是先安裝 readline

Python-3.3.3 # sudo apt-get install readline-common readline-common 已經是最新版本了。

…… 開我玩笑嗎。

查了一下 Google 發現網路上一大票這種問題,典型的解決方案都是要我們編輯

./Modules/Setup.dist
./Setup.py

這幾個檔案或者使用 export PATH、LD_LIBRARY_PATH,等千奇百怪的方法。 實際試過之後,還是無法解決問題…。 整個很 Orz ,還在想要不要乾脆直接 apt-get install python3.2 算了。

想歸想,遇到問題還是得解決,之後一定還會有很多機會需要自己手動編譯,這也是 Linux-based 吸引人的特性之一(對於能夠認同 Open source 哲學的人來說)。

皇天不負苦心人,最後在茫茫資料中,看到了一個被發問者評為正確答案的回答。

I installed libncurses5-dev and libreadline5-dev, recompiled python and reinstalled (make / make install).

決定死馬當活馬醫,反正前面已經嘗試一堆沒有效果的方法了,多來一個也沒啥差別。

apt-get install libncurses5-dev libreadline5-dev make


Modules/Setup.dist is newer than Modules/Setup; check to make sure you have all the updates you need in your Modules/Setup file. Usually, copying Modules/Setup.dist to Modules/Setup will work.


running build running build_ext Python build finished, but the necessary bits to build these modules were not found:

_curses __curses_panel _tkinter
_lzma _ssl

To find the necessary bits, look in setup.py in detect_modules() for the module’s name.

To find the necessary bits, look in setup.py in detect_modules() for the module’s name.

(!), readline 竟然消失在列表上了,一定有啥巫術。

仔細看一下 apt-get install libncurses5-dev libreadline5-dev 這行,我發現了 libmodule name-dev 這樣的規則,好像發現新大陸一樣,一路試了:

例如,openssl

apt-get install libssl-dev

success!,以此類推,把 lib 後綽是 dev 的裝上去(查資料才知道,make 會需要用到開發包,開發包有包含 include 等開發會用到檔案的樣子),解決所有依賴問題,覆蓋一張 make install 完成 Python 3.3.3 安裝!

make install

手動編譯成功,截圖紀念:

0

快期中考了, 我竟然花一堆時間在搞這種東西 ……。

順帶一提,這篇文章是用 Logdown 的 Markdown 編輯器寫完,在丟過來餵給 Tumblr 的 Markdown 引擎,各種羨慕 Logdown 的 Markdown 編輯器 …。