首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何在arm单板中压缩python详解(1)

如何在arm单板中压缩python详解(1)

注:下文的CSU是我们单板的名称。
1 前言平时开发时,采用NFS我认为是最方便的方式,但是,如果哪一天真要用python程序直接在CSU上跑,NFS明显是不现实的,因此,必须要研究如何将python挤进CSU里。
2 方案思路思路1:采用专业打包工具,例如cx_Freeze
思路2:自己组建一个最小运行环境
2.1 打包思路这种思路是将python程序变成可执行文件,并将用到的库放在一起,即不用安装python,也可以运行。
其实,我个人是最认同这种思路的,通过打包工具将python程序实际需要的库打包起来,可以做到最小的效果,而且还非常方便。
但是,打包工具面对交叉编译的环境,真不知道怎么弄。
我采用了可以跨平台的cx_Freeze,这个工具不仅支持python2python3,而且支持linuxwindowsMac OS的系统。功能是比较强大的。我在linuxwindows下都可以非常方便的打包python程序。
但是,如何打包armpython程序,这个我真不会了,查阅了官方和论坛很多资料,都没有找到解决方案。我自己也尝试了很多方法,都没有成功,最纠结的地方在于:
如果在pclinux上运行cx_Freeze打包,那么,会将pc版本的python相关的库和文件打包进来,如果将python的链接指向arm版本的pythonarm版本的python又无法解析cx_Freezesetup文件,这是个很矛盾的地方。而且,安装cx_Freeze中,需要用到gcc编译一些和平台相关的.so动态库文件,如何将gcc换成arm-none-linux-gnueabi-gcc也是个麻烦事,至少官方文档中没有说明,除非修改其安装源码。
那在CSU上安装cx_Freeze呢?安装倒是可以,选择的也是arm版本的python,但是,最关键的就是,运行中,需要用到gcc进行编译。CSU怎么在自身进行编译呢?这是个问题,如果这个关键问题解决了,估计可以迎刃而解。希望有人可以解决这个问题啊。
那看来没有办法了,只能使用思路2了。
2.2 组建最小环境思路pc版本的python,安装后有70M,明显是放不进CSU的,因此,必须(减肥)瘦身。
经过最终尝试,全功能环境只需要6M,最小环境只需要1.2M的空间即可。
3 研制最小环境python要瘦身,就必须理解python的文件结构。
安装路径下,真正在运行中用到着的只有binlib两个文件夹。
为了讲解不那么抽象,这里以python2.7为例进行陈述。
(为什么选择2.7呢,因为,我发现同样是打印1000次字符串,CSU环境下,python2.7python3.3快了3倍速度。而且很多网络的第三方库都不支持python3.3。)
3.1 排除非必需文件bin文件夹中,只有python2.7这个文件,是真正用到的执行文件。
lib中,只有libpython2.7.so.1.0python2.7文件夹是真正用到着的。
其余的在大量的实验中,均发现是可以删除的。
(注意,如果configure中,采用静态库进行编译,那么是没有libpython2.7.so.1.0文件的,当然,这个文件的内容被放进执行程序中而已)
(采用动态库的好处是,其他程序可以使用libpython的库了,那谁会用到这个库呢,举例,大名鼎鼎的vim就会用到这个库。在虚拟机下,ldd /usr/bin/vim,可以看到vim使用的动态库中,就有libpython。如果CSU哪天需要安装vim,那么这个库是必要的)
(再啰嗦一下,ubuntudebian系列的都是)默认将python库安装在/usr/lib路径下,将site-packagesdist-packages这两个专门存放用户第三方python库的文件夹放在/usr/local/lib路径下。如果你是自己下载源码包进行安装,默认都是安装在/usr/local/lib上的。这时,/usr/lib路径下就会有原有版本的python可以删除了,除了可以节省磁盘空间,还可以减少因为搜索路径问题带来的麻烦,我就碰到过。因此,建议删除原有的/usr/lib里面的python文件夹。但注意的是,不要删除libpython动态库,因为,其他程序,例如vim要用到,而ubuntu搜索默认库的路径是/lib,/usr/lib,因此,建议不要移动这几个python动态库。如果不幸被你删除了,可以在源码包重新三部曲,关键是./configure --enable-shared --prefix=/usr
返回列表