社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python中文社区 • 7 年前 • 709 次点击  

Python中文社区
全球Python中文开发者的
精神部落

笔者长期在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开发实战》一书。


     


赞赏作者

最近热门文章

用Python更加了解微信好友

如何用Python做一个骚气的程序员

用Python爬取陈奕迅新歌《我们》10万条评论的新发现

用Python分析苹果公司股价数据

Python自然语言处理分析倚天屠龙记

▼ 点击下方阅读原文免费成为社区会员


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/hl3v2ECrbd
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/11771
 
709 次点击