前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >移植Python2.7到ARM-LINUX嵌入式平台

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

作者头像
Python中文社区
发布2018-07-26 17:40:32
发布2018-07-26 17:40:32
8.2K10
代码可运行
举报
文章被收录于专栏:Python中文社区Python中文社区
运行总次数:0
代码可运行

笔者长期在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

源码下载&解压

代码语言:javascript
代码运行次数:0
复制
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的解释器。

代码语言:javascript
代码运行次数:0
复制
./configure  
make python Parser/pgen  
mv  python  hostpython  
mv  Parser/pgen  Parser/hostpgen  
make distclean

打交叉编译补丁

代码语言:javascript
代码运行次数:0
复制
patch -p1 < Python-2.7.3-xcompile.patch

交叉编译配置

设置交叉编译工具链为arm-none-linux-gnueabi,编译生成的执行文件存放目录为当前目录的_install文件夹。

代码语言:javascript
代码运行次数:0
复制
./configure --host=arm-none-linux-gnueabi --prefix=$PWD/_install

编译&安装

代码语言:javascript
代码运行次数:0
复制
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。

代码语言:javascript
代码运行次数:0
复制
export PYTHONPATH=/lib/python2.7:$PYTHONPATH  
export PYTHONHOME=/lib/python2.7:$PYTHONHOME

如果是命令行,执行如下:

代码语言:javascript
代码运行次数:0
复制
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开发实战》一书。

最近热门文章

用Python更加了解微信好友

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作者:安翔,擅长嵌入式Linux与Python,目前专注于Python与物联网的结合。热爱技术写作,著有《物联网Python开发实战》一书。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档