文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在OpenHarmony部署Python编程环境

2024-11-29 20:33

关注

笔者最近将python解释器cpython3.8移植到了OpenHarmony标准系统上。并且开源相关编译产物。

开源仓库:https://gitee.com/from-north-to-north/OpenHarmony_Python

本文介绍如何在OpenHarmony标准系统上部署Python3.8编程环境,并且使用Python调用C/C++的SO库。

移植思路分享:

使用 OpenHarmony NDK 在X86的linux主机上 交叉编译 出OpenHarmony arm平台可以运行的Cpython解释器。

OpenHarmony系统采用llvm项目中的libc作为C运行时库,在系统侧使用libc ++ .so库来承载,应用侧使用libc++_shared.so来承载,两边一套代码,不同的C++命名空间。https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/ohos-abi.md#c-abi

可执行文件格式:

目前缺失的模块:

在OpenHarmony标准系统上部署Python3.8编程环境

解压cpython-3.8_oh_install.tar.xz文件为cpython-3.8_oh_install.tar文件。

将解压好的cpython-3.8_oh_install.tar文件发送到开发板data目录,将cpython-3.8_oh_install.tar解压。

hdc file send cpython-3.8_oh_install.tar /data
hdc shell #进入开发板终端
cd data
tar -xvf cpython-3.8_oh_install.tar

设置python命令(cpython编译出来的可执行文件)所在路径。

export PYTHONHOME=/data/cpython-3.8_oh_instal/bin

设置python库文件所在路径,包含两个路径。

# /data/cpython-3.8_oh_install/lib/python3.8里面有基础库的.py文件
# /data/cpython-3.8_oh_install/lib/python3.8/lib-dynload里面有zlib、libffi等三方库的so 以及 import math需要的math.cpython-38-aarch64-linux-gnu.so等诸如此类的so
export PYTHONPATH=/data/cpython-3.8_oh_install/lib/python3.8:/data/cpython-3.8_oh_install/lib/python3.8/lib-dynload

# 设置third_party的so库的查找位置 
# 因为把third_party的,例如libffi的库文件放在/data/cpython-3.8_oh_install/lib/python3.8/lib-dynload
export LD_LIBRARY_PATH=/data/cpython-3.8_oh_install/lib/python3.8/lib-dynload:$LD_LIBRARY_PATH

运行python3。

cd cpython-3.8_oh_install
./bin/python3

将开发板连接网络,安装pip。

# 安装pip
./bin/python3 -m ensurepip --upgrade

# 卸载pip
./bin/python3 -m pip uninstall pip

# pip管理的三方列表
./bin/bin/pip3 list

# 安装requests库,使用国内清华源
./bin/bin/pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

# 卸载requests库
./bin/bin/pip3 uninstall request

将64位python3和pip添加到系统环境变量中。

export PATH=/data/cpython-3.8_oh_install/bin:$PATH
export PATH=/data/cpython-3.8_oh_install/bin/bin:$PATH

#上一步中pip3 and pip3.8被安装在/data/cpython-3.8_oh_instal
export PATH="/data/cpython-3.8_oh_instal/bin/bin:$PATH"

在OpenHarmony标准系统中使用Python的ctypes模块调用C/C++的SO库(类似于NAPI)

下面以一个简单的例子来实现在OpenHarmony标准系统中用Python的ctypes模块调用C/C++的SO库(类似于NAPI),按照以下步骤进行:

下载example工程,工程目录结构为。

.
├── CMakeLists.txt
└── example.c
#include 

// 一个简单的C函数,将两个整数相加并返回结果
int add(int a, int b) {
    return a + b;
}
add_library(example SHARED example.c)

使用OpenHarmony NDK编译example工程,下载 OpenHarmony SDK 到linux环境,解压好其中linux的native-linux-x64-x.x.x.x-Release.zip包。

设置OpenHarmony NDK 64位编译工具链环境变量。

# 设置 ohos 64bit 库编译工具链环境变量 aarch64-linux-ohos
export OHOS_SDK=/home/jiajiahao/OpenHarmony/ndk/ohos-sdk/linux  # 此处是我的ohos_sdk解压目录,请替换为你自己的解压目录

export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=aarch64-linux-ohos"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=aarch64-linux-ohos"
export LD=${OHOS_SDK}/native/llvm/bin/ld.lld
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -D__MUSL__=1"
export CXXFLAGS="-fPIC -D__MUSL__=1"

设置好OpenHarmony NDK编译环境后,编译example工程。

cd example
mkdir build 
cd build 
make clean

 # /home/jiajiahao/OpenHarmony/ndk/ohos-sdk/linux是此处是我的ohos_sdk解压目录,请替换为你自己的解压目录
/home/jiajiahao/OpenHarmony/ndk/ohos-sdk/linux/native/build-tools/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=/home/jiajiahao/OpenHarmony/ndk/ohos-sdk/linux/native/build/cmake/ohos.toolchain.cmake  .. -L 

make

将编译好的libexample.so发送到开发板上,使用Python调用so库。

执行以下代码:

创建一个名为example.py的Python文件,编写如下代码:
import ctypes

# 加载C共享库
libexample = ctypes.CDLL('./libexample.so')

# 调用C函数
result = libexample.add(2, 3)
print("Result:", result)

调用so库,最后得到两个数字相加的结果。

来源:鸿蒙开发者社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯