1. 程式人生 > >移植Python2.7到ARM-LINUX嵌入式平臺

移植Python2.7到ARM-LINUX嵌入式平臺

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1Python中文社群全球Python中文開發者的精神部落640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

筆者長期在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

原始碼下載&解壓

  1. wget https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.xz  

  2. xz -d Python-2.7.3.tar.xz  

  3. tar xvf Python-2.7.3.tar

編譯HOST版直譯器

編譯Python的嵌入式版需要直譯器解析setup.py從而編譯Python的模組,因此需要先編譯出HOST的直譯器。

  1. ./configure  

  2. make python Parser/pgen  

  3. mv  python  hostpython  

  4. mv  Parser/pgen  Parser/hostpgen  

  5. make distclean

打交叉編譯補丁

  1. patch -p1 < Python-2.7.3-xcompile.patch

交叉編譯配置

設定交叉編譯工具鏈為arm-none-linux-gnueabi,編譯生成的執行檔案存放目錄為當前目錄的_install資料夾。

  1. ./configure --host=arm-none-linux-gnueabi --prefix=$PWD/_install

編譯&安裝

  1. make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-none-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-none-linux-gnueabi- CROSS_COMPILE_TARGET=yes  

  2. 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。

  1. export PYTHONPATH=/lib/python2.7:$PYTHONPATH  

  2. export PYTHONHOME=/lib/python2.7:$PYTHONHOME

如果是命令列,執行如下:

  1. export PYTHONPATH=$PYTHONPATH:/lib/python2.7

  2. 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開發實戰》一書。


     

讚賞作者

640?wx_fmt=png

最近熱門文章

640?wx_fmt=jpeg

▼ 點選下方閱讀原文免費成為社群會員