记录移植Python3到arm开发板linux系统中

本文介绍了如何将Python3从主机环境移植到基于ARM架构的开发板上运行。首先,编译安装了Python3的host版本,然后配置交叉编译器环境变量,交叉编译zlib。接着,交叉编译Python3的target版本,并将编译后的bin和lib文件拷贝到开发板上。最后,安装所需的Python扩展模块,如setuptools、jdcal、et_xmlfile和openpyxl,确保所有模块都能正常工作。整个过程需要注意错误处理和文件时间戳问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求场景

开发板情况

arm板是公司采购的工控机。主要用来 使用python3解析excel表格处理数据。
配置如下:

配置版本
cpuimx6dl(armv7架构)
操作系统linux3.10
python版本2.7

项目情况

项目中最好使用python3 。可行的有以下几种方式:

方式优缺点可行度
重做文件系统订制程度比较高,后期增加减少模块简单,但是前期需要厂家提供的资料较多。由于厂家只给了固件,暂不可行
交叉编译python3拷贝到开发板中只需要知道交叉编译器版本就可以移植,但是很多模块需要自己编译并解决依赖项目中需要的额外模块不多,可行度较高

这里使用交叉编译python3之后再拷贝到开发板中的方式

移植前准备

PC虚拟机系统
ubuntu1804 x64
python3源码:https://www.python.org/downloads/source/
zlib源码:http://www.zlib.net/
python3 扩展模块 : https://pypi.org
	setuptools源码:
	jdcal源码:
	et_xmlfile源码:

移植具体步骤

主要分为以下几个步骤:
1,编译安装python3的host版本(PC)。
2,配置交叉编译器环境变量
3,交叉编译zlib
4,交叉编译python3的target版本
5,把bin和lib都拷贝到arm板子上
6,安装python扩展模块

1,编译安装python3的host版本

1) 查看当前ubuntu中是否有python3,打开终端执行以下命令。

python --version

如果有python3,可以直接到https://www.python.org/downloads/source/下载对应版本的源码。然后跳过当前步骤。
2)下载python3.9.5源码,拷贝到虚拟机里。打开终端执行如下命令:

tar -xf  Python-3.9.5.tar
cd Python-3.9.5/
./configure --prefix=$PWD/../_install_host --enable-shared
make -j4
make install
make distclean

以上命令把python3.9.5安装到本机中,另起一个终端,输入python --version 或者python3 --version 查看版本是否是当前安装的。如果不对可以手动指定环境变量。

export PATH=/home/user/_install_host/bin:$PATH
export LD_LIBRARY_PATH=/home/user/_install_host/lib:$LD_LIBRARY_PATH

2,配置交叉编译器环境变量

这里使用的是gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux,解压后添加到.bashrc最后

gedit ~/.bashrc

#末尾加入两行
export PATH=$PATH::/home/usr_/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/usr_/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/lib

#保存退出后执行
source ~/.bashrc
#执行
arm-linux-gnueabihf-gcc -v

3,交叉编译zlib

下载zlib后,拷贝到虚拟机中,在对应目录打开终端。执行:

tar -xf zlib-1.2.3.tar.xz
cd zlib-1.2.3/
export CC=arm-linux-gnueabihf-gcc #它的configure不支持用CC变量来指定交叉工具链
./configure --prefix=$PWD/arm——build #最后生成的库、头文件和man文件都在当前目录的arm-build目录下
make && make install

4,交叉编译python3的target版本

进入python3源码目录中。确认号交叉编译器正常。

arm-linux-gnueabihf-gcc -v

进入执行配置命令

./configure --host=arm-linux --build=armv7 --prefix=$PWD/arm_build \
--enable-ipv6 --enable-shared \
ac_cv_file__dev_ptmx="yes" ac_cv_file__dev_ptc="yes"\
 LDFLAGS="-L/home/gec/tools/zlib-1.2.13/arm_build/lib" \
CPPFLAGS="-I/home/gec/tools/zlib-1.2.13/arm_build/include" \
--with-ensurepip=yes        --enable-optimizations 

再arm_bulid目录下可以看到编译生成的arm版本的程序
5,把bin和lib都拷贝到arm板子上

scp -r arm_build/bin/* root@192.168.0.106:/usr/bin
scp -r arm_build/lib/* root@192.168.0.106:/usr/lib

进入到arm板卡中。直接执行python3 --version。

python3 --version
#如果没有执行权限就执行:
chmod +x /usr/bin/* -R
chmod +x /usr/lib/* -R
# 测试zlib模块是否正常
root@imx6qsabresd:/usr/sbin# python3
Python 3.9.5 (default, Feb 14 2023, 21:00:17)
[GCC 4.9.2 20140904 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import zlib
>>>

都正常之后可以增加一个链接,每次之心python自动默认python3

rm /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python

6,安装python扩展模块

把下载好的几个包拷贝到板卡中。
执行命令时注意打印信息是否有错误
如果有错误,需要先解决错误。

  • 错误情况1:”zlib“module??
    解决方案:确认以上步骤zlib编译和python3编译过程是否正确。然后重新编译python3。
  • 错误情况2: ValueError: ZIP does not support timestamps before 1980
    解决方案: 文件拷贝到开发板中后文件修改时间丢失。但是zip模块要求时间再1980年之后。所以修改这些模块文件的时间即可。这里提供一个python文件:
import os
import sys
import time
 
# 修改文件的【修改日期】
def set_file_time(filename, updatetime='now', access_time='now'):
    filename = os.path.abspath(filename)
    if updatetime == 'now':
        new_updatetime = time.time()
    else:
        new_updatetime = time.mktime(time.strptime(updatetime, "%Y-%m-%d %H:%M:%S"))
    if access_time == 'now':
        new_access_time = time.time()
    else:
        new_access_time = time.mktime(time.strptime(access_time, "%Y-%m-%d %H:%M:%S"))
    os.utime(filename, (new_access_time, new_updatetime))
 
# 修改一个文件夹内所有文件的【修改日期】
def set_all(path):
    for i in os.listdir(path):
        file = os.path.realpath(os.path.join(path, i))
        if os.path.isfile(file):
            set_file_time(file)
        elif os.path.isdir(file):
            set_all(file)
 
if __name__ == '__main__':
    path = sys.argv[1]  # 这里更换为你要修改的文件夹
    set_all(path)   # 修改以上文件夹内所有文件的日期

把以上内容拷贝到一个文件里。命名为settime.py。放到和python平级目录下。

python3 settime.py jdcal
python3 settime.py et_xmlfile
python3 settime.py openpyxl

1,安装setuptools

tar -xf setuptools-67.2.0.tar.gz
cd setuptools-67.2.0
python3 setup.py build 
python3 setup.py install

2,安装jdcal

tar -xf jdcal-1.4.1.tar.gz
cd jdcal-1.4.1
python3 setup.py build 
python3 setup.py install

3,安装et_xmlfile

tar -xf et_xmlfile-1.1.0.tar.gz
cd et_xmlfile-1.1.0
python3 setup.py build 
python3 setup.py install

4,安装openpyxl

tar -xf openpyxl-3.1.2.tar.gz
cd openpyxl-3.1.2
python3 setup.py build 
python3 setup.py install

正常完成安装后执行,

root@imx6qsabresd:~/python-tools# python3
Python 3.9.5 (default, Feb 14 2023, 21:00:17)
[GCC 4.9.2 20140904 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import openpyxl
>>>

没有报错说明安装成功。

小结

1,移植过程中每一步要根据自己本机的情况,和开发板的情况修改对应目录和文件。
2,编译和安装过程中的报错和打印信息尽量多观察。对于解决问题帮助很大。

参考链接

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值