移植Python2.7到ARM-LINUX嵌入式平臺
筆者長期在ARM-LINUX嵌入式平臺使用C語言開發。硬體IO操作只能用C確實沒辦法,但是應用程式用C簡直就苦逼了,程式複雜一點,各種越界、指標錯誤、詭異宕機、segment fault、記憶體洩漏、core dump、編譯找不到標頭檔案、依賴庫,解析個字元費老勁,輪子太少純靠白手起家。自從把Python移植到嵌入式平臺,用C寫完IO的Python擴充套件庫然後用Python寫應用程式完全就是摧枯拉朽般存在。
Python版本:2.7.3
交叉編譯器:arm-none-linux-gnueabi-
硬體平臺:AT91 ARM9、NUC97x、TI AM335x
原始碼下載&解壓
wget https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.xz
xz -d Python-2.7.3.tar.xz
tar xvf Python-2.7.3.tar
編譯HOST版直譯器
編譯Python的嵌入式版需要直譯器解析setup.py從而編譯Python的模組,因此需要先編譯出HOST的直譯器。
./configure
make python Parser/pgen
mv python hostpython
mv Parser/pgen Parser/hostpgen
make distclean
打交叉編譯補丁
patch -p1 < Python-2.7.3-xcompile.patch
交叉編譯配置
設定交叉編譯工具鏈為arm-none-linux-gnueabi,編譯生成的執行檔案存放目錄為當前目錄的_install資料夾。
./configure --host=arm-none-linux-gnueabi --prefix=$PWD/_install
編譯&安裝
make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-none-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes
make install HOSTPYTHON=./hostpython BLDSHARED="arm-none-linux-gnueabi-gcc-shared" CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=$PWD/_install
執行完以上命令之後在_install中產生bin lib include share 4個資料夾,避免麻煩可以將以上命令寫成一個指令碼。
目標板檔案拷貝
將_install/bin 中的所有內容拷貝到目標板的任意環境變數能夠訪問到的目錄即可,推薦/bin、/usr/bin。
將_install/lib 中的所有內容拷貝到目標板/lib中
將_install /include 中的所有內容拷貝到目標板/include中。因為其中的某些標頭檔案是Python環境所需要的,比如Python直譯器啟動依賴於pyconfig.h,import time模組時依賴timefuncs.h。
環境變數設定
將python2.7路徑加入到環境變數 PYTHONHOME、PYTHONPATH中。
如果是/etc/profile,在檔案末尾新增如下資訊然後執行 source /etc/profile。
export PYTHONPATH=/lib/python2.7:$PYTHONPATH
export PYTHONHOME=/lib/python2.7:$PYTHONHOME
如果是命令列,執行如下:
export PYTHONPATH=$PYTHONPATH:/lib/python2.7
export PYTHONHOME=$PYTHONHOME:/lib/python2.7
驗證目標板Python
開啟直譯器,import 一些常用模組,編寫程式測試。
後記
可能import time、datetime、threading、multiprocessing時提示缺少time、_collections、itertools等模組。
這些是 builtin 模組,可以通過sys.builtinmodulenames檢視。其原始碼在Modules目錄中,編譯完成以 .so 的形式存放在/lib/python2.7/lib-dynload中。
首先在setup.py中 disabledmodulelist=[] 是否將這些模組disabled掉了。
如果依然無法解決,則在Modules/config.c中參考其他模組的寫法新增程式碼,手動編譯即可在build/lib.xx.2.7目錄中產生 .so 檔案。
❈作者:安翔,擅長嵌入式Linux與Python,目前專注於Python與物聯網的結合。熱愛技術寫作,著有《物聯網Python開發實戰》一書。
❈讚賞作者
最近熱門文章
▼ 點選下方閱讀原文,免費成為社群會員