歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 交叉編譯Python 3.3 壓成1.5MB

交叉編譯Python 3.3 壓成1.5MB

日期:2017/3/1 9:47:03   编辑:Linux編程

在研究如何在嵌入式Linux上搭建Python運行環境,因為有了Python之後,很多工具例如GoAgent之類的東西就可以用上場了。昨天成功編譯了Python2.6,參考了網上很多方法,但最後無果而終,現在總結了一套自己的編譯方法,基本上可以秒殺所有Python版本的交叉編譯,這裡做一個總結。我的編譯環境是Debian64位 無桌面版本,體積很小巧,安裝在辦公室電腦虛擬機裡,在家裡也可以遠程編譯代碼。

首先在Python網站下載最新版源代碼,這裡我使用Python 3.3版本。解壓下,有下面這堆東西。

接著,編輯Modules/Setup.dist,把需要用到的模塊,去掉注釋。

因為我打算把_socket,math,time,md5,sha1,select等模塊靜態編譯進去(這樣就不用lib-dynload裡的一堆so文件都可以使用那些功能了)。

為了支持中文的decode和encode,下面兩個模塊也要編譯進去。

如果你把zlib去掉了注釋,要先交叉編譯zlib,把編譯出來的兩個頭文件和一個libz.a放到/usr/local/或者其他編譯器能夠發現的地方。

下面在configure之前,需要做一些小動作,不然會提示出錯。

root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptmx=no > config.site

root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptc=no >> config.site

root@dev:~/Python-3.3.2# export CONFIG_SITE=config.site

root@dev:~/Python-3.3.2# ./configure CC=mipsel-linux-gcc CXX=mipsel-linux-g++ AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib –host=mipsel-linux –build=mipsel –disable-ipv6

我的交叉編譯工具是mipsel-linux-*。如無意外,運行完畢應該得到Makefile文件。

編輯Makefile,在CONFIGURE_LDFLAGS後面添加 -s -static 兩個選項。

下一步,開始編譯。

root@dev:~/Python-3.3.2# make python

如無意外,當前目錄下就可以得到python。因為我前面忘了加-s參數,所以編譯出來體積有點大。可以使用strip工具去掉調試信息和一些不必要的內容,不影響運行。

strip之後,文件大小從8MB變為3MB。不過還是蠻大的,試試使用UPX壓縮一下。工具下載:http://upx.sourceforge.net/

UPX之後,文件大小為 1 MB。對程序運行效率會有影響,不過只在啟動的時候有影響,不會影響正常解釋腳本的速度

使用scp或者ftp復制該文件到路由器上,看看能否執行。

可以正確顯示版本號,不過無法進入命令行,提示缺少encodings,那是因為還沒有把Python的Lib復制過來。如果是Python2.x的版本,在這裡已經可以運行使用了。所以,剩下只需要把要用到的標准庫文件都復制過來就行了。

復制一份Lib目錄,然後把不要的庫像tkinter的全部刪掉,encodings下除gbk和utf8以外的其它編碼也不需要。

剩下5MB大小。復制到路由的對應目錄下,比如說 /tmp/root/python/lib/python3.3,同時設置 export PYTHONHOME=/tmp/root/python。

再嘗試運行,發現缺少 _sysconfiguredata.py 文件,這個文件在Modules裡應該能找到,或者別的地方,把它復制過來,放到標准庫目錄下就OK。

因為標准庫有5MB那麼大,不是很方便寫到Flash上,所以可以考慮把標准庫壓縮成一個Zip文件。

在python3.3目錄下,使用批處理把所有py擴展名,通過 python3 -m py_compile *.c 編譯成pyc文件,然後刪除原來的py文件,接著執行

zip -9r python33.zip *

得到的文件大小為1MB。(我的python2.6的大小是500KB)。然後復制python33.zip到 /tmp/root/python/lib/python33.zip。就可以使用了。

其實,像 pyinstaller和py2exe這類壓縮工具,也是用了同樣的方法,而我這裡是打包python運行環境到嵌入式Linux上。

比較一下 Python2.6 和 Python3.3 的在路由器上的體積。

Python2.6: 不帶庫 800KB,帶基本標准庫 1.3MB

Python3.3:不帶庫 1MB,帶基本標准庫 2.1MB

個人比較喜歡Python2.6的版本,因為不論是體積還是運行速度,都好很多。配合100KB的 bottlepy 網頁開發框架,編寫了一個簡單的頁面。

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved