移植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开发实战》一书。

最近热门文章

用Python更加了解微信好友

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

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

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

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

原文发布于微信公众号 - Python中文社区(python-china)

原文发表时间:2018-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏V站

图片API丨V站二次元随机图片API(自判断)

①于2018.03.31公布,采用高速服务器运行! ②PC版随机图片拥有200+张,PE版拥有100+张超精美二次元风随机图片,每星期一更! ③全程免费,欢迎支...

4.7K100
来自专栏友弟技术工作室

Mac Book 上的touch id妙用1password6用 Touch ID 授权 sudo

使用新版的macbook或pro都是支持Touch ID。 Touch ID在工作生活中,有哪些妙用。 今天介绍一下我常用的touch id 1passwor...

39880
来自专栏程序员的知识天地

这一堆初中生写的类库、框架,让一群中年程序员坐不住了!

前不久在V2EX上看到一个帖子,主题是「一堆初中生写的类库、框架」,原本猿妹以为只是个标题党不以为意。点进去该博主的博客主页发现,博主确实是一名初中生,而且他的...

15030
来自专栏北京马哥教育

服务器程序源代码分析之二:php-fpm

php作为排名top2 互联网开发工具,非常流行,可以参考:中国最大的25个网站采用技术选型方案 php这个名称实际上有两层含义 广义的php 是指用后缀名为....

39740
来自专栏小狼的世界

提高Mac下itunes的下载速度

给老婆买了iPhone4s之后,开始在Mac上用iTunes下载软件,发现速度龟速,好歹家里也是10M光纤啊,这个小水管的下载速度绝对不能忍受,于是百度了一下,...

13820
来自专栏VMCloud

【解析向】腾讯云的Windows Server日志配置收集工具是个什么鬼?(5)

且听笔者一句劝,无论是Windows还是Linux抑或是Unix都是大部分理论是相同的,与其与人争吵对比这几个平台之类的差异,不如好好研究下底层的各个子系统...

27470
来自专栏Laoqi's Linux运维专列

zabbix 告警收敛(Python)研究价值高!

1.3K40
来自专栏张戈的专栏

WordPress发布文章主动推送到百度,加快收录保护原创

工作实在太忙,也没时间打理网站。最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会、啥都要做的苦逼运维的真实写照了...)。 于是抽空看...

36960
来自专栏电光石火

idea 创建的maven+spring+mybatis项目整合 报错无法创建bean

最近在做一个由maven构建的spring+spring mvc+mybatis项目,刚开始的时候是用自己的电脑Win10环境下的eclipse写的,托管到了码...

39060
来自专栏技术翻译

为微服务架构编写端到端测试

微服务架构的一个主要方面是应用程序形成为松散耦合的服务的集合,每个服务可以独立地部署并且通过某种轻型协议相互通信。

25210

扫码关注云+社区

领取腾讯云代金券