1、在openwrt系统上使用opkg的方式安装Python有关的库时,又时会遇到麻烦,还需要注意安装顺序;所以打算编译一个能直接在openwrt上跑的Python;
Python源码下载:可以直接去官网下载https://www.python.org/downloads/,这里使用的Python2.7.7版本
交叉编译工具:直接使用openwrt工程下的交叉编译工具链,如果没有最好能编译一下openwrt,对于开发来说是必须的;这里使用的是64位Intel的cpu,那么交叉编译工具链选择:x86_64-openwrt-linux-xxx;不同平台使用不同工具链;
编译环境:Ubuntu16.04(使用的较新Ubuntu,在16.04上搭建openwrt编译环境时会有点麻烦,推荐使用Ubuntu14.04版本)
2、编译过程
在Ubuntu下解压Python源码
tar xf Python-2.7.7.tar.xz .
进入解压后的目录
cd Python-2.7.7
进行一些必要的配置,这里可以配置CC、CFLAGS、LDFLAGS,但是此处选择默认即可
./configure
编译Python需要使用python语法解释器
make python
Parser/pgen
mv python dstpython
mv Parser/pgen Parser/dstpgen
make distclean
添加环境变量,编译的时候会去寻找这个路径下的编译工具链,
export PATH=$PAHT:~/software/staging_dir/toolchain-x86_64_gcc-5.5.0_glibc/x86_64-openwrt-linux/bin/
export STAGE_DIR=~/openwrt/staging_dir/
./configure
make HOSTPYTHON=./dstpython HOSTPGEN=./Parser/dstpgen BLDSHARED="x86_64-openwrt-linux-gcc -shared" CROSS_COMPILE=x86_64-openwrt-linux- CROSS_COMPILE_TARGET=yes HOSTARCH=x86_64-linux BUILDARCH=x86_64-linux-gnu
(ps:注意使用需要编译的目标机平台的工具链,此处是x86_64,其他的有arm、mips等等)
编译最后会提示
关于这些模块需要去安装一些库,具体的可参考一下https://www.linuxidc.com/Linux/2016-06/132691.htm
实际上程序也是可以使用的,只是可能在使用这些模块的地方会有错误;
3、移植Python
在Python-2.7.7目录下会有python这个可执行文件,将python和Python-2.7.7目录下的Lib目录打包到目标机上,一般放在/usr目录下;
目标机上新建/usr/python2.7目录
将Lib以及python都放进去;由于目标机的环境变量PATH并没有包含/usr/python2.7,需要添加一下
export PYTHONHOME=/usr/python2.7
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH
其中PYTHONHOME和PYTHONPATH是执行python需要的环境
最后运行python……
如果提示会找不到某些模块,这里遇到过找不到_sysconfigdata、site、select等等,
可以先在python的编译目录下寻找,其中select是以select.so存在,其实在编译目录的 build/lib.linux-xxx-2.7/下会有,只是PATH没有添加上这个环境变量导致没有找到,那么解决方法就是将build/lib.linux-xxx-2.7/*.so都拷贝到/usr/python2.7目录下;
其他的模块都是类似的解决方法,就不再详述。
参考:https://www.jianshu.com/p/f77554a9da76