OpenHarmony开发者论坛

标题: 在OpenHarmony标准系统上使用Python调用C/C++的SO库(移植python3.8到OpenHarmony标准系统) [打印本页]

作者: 润开鸿_贾佳豪    时间: 2023-12-24 13:48
标题: 在OpenHarmony标准系统上使用Python调用C/C++的SO库(移植python3.8到OpenHarmony标准系统)
[md]笔者最近将python解释器[cpython3.8](https://github.com/python/cpython)移植到了OpenHarmony标准系统上。并且开源相关编译产物。

- 开源仓库:[在OpenHarmony标准系统上部署Python3.8编程环境](https://gitee.com/from-north-to-north/OpenHarmony_Python)

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


---

# 在OpenHarmony标准系统上使用Python调用C/C++的SO库

移植思路分享:

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

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

3.可执行文件格式:

- OpenHarmony系统采用ELF文件格式作为全系统的二进制文件格式

目前缺失的模块:
![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_389)

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

- 使用环境
  - OpenHarmony 4.0R
  - SDK: [OpenHarmony SDK 官方发布渠道](https://gitee.com/openharmony-si ... -Testing-Version.md) 获取的[4.0.10.5](http://download.ci.openharmony.c ... blic_monthly.tar.gz)

### 1.1 在OpenHarmony arm64位上部署python3.8编程环境

- 相关文件下载地址:[python3.8 for arm64 OpenHarmony](https://gitee.com/from-north-to- ... F%E5%A2%83/arm64-v8)

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

2.将解压好的 `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
```

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

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

4.设置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-dynloadLD_LIBRARY_PATH
```

5.运行python3

```
cd cpython-3.8_oh_install
./bin/python3
```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_264)

6.将开发板 `连接网络`,安装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

```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_850)

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_512,h_379)

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

```
export PATH=/data/cpython-3.8_oh_install/binPATH
export PATH=/data/cpython-3.8_oh_install/bin/binPATH

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

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_608)

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

- 使用环境
  - OpenHarmony 4.0R
  - SDK: [OpenHarmony SDK 官方发布渠道](https://gitee.com/openharmony-si ... -Testing-Version.md) 获取的[4.0.10.5](http://download.ci.openharmony.c ... blic_monthly.tar.gz)
  - 编译环境:ubuntu18.04

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

1.下载[example](https://gitee.com/from-north-to- ... +%E4%BB%A3%E7%A0%81(Python%E8%B0%83%E7%94%A8c%E6%88%96c++%E7%9A%84so,%E7%B1%BB%E4%BC%BC%E4%BA%8ENAPI)/example)工程,工程目录结构为

```
.
├── CMakeLists.txt
└── example.c
```

- example.c内容如下

```
#include <stdio.h>

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

- CMakeLists.txt

```
add_library(example SHARED example.c)
```

2.使用OpenHarmony NDK编译[example](https://gitee.com/from-north-to- ... +%E4%BB%A3%E7%A0%81(Python%E8%B0%83%E7%94%A8c%E6%88%96c++%E7%9A%84so,%E7%B1%BB%E4%BC%BC%E4%BA%8ENAPI)/example)工程,下载 [OpenHarmony SDK ](https://gitee.com/openharmony-si ... -Testing-Version.md) 到linux环境,解压好其中linux的 `native-linux-x64-x.x.x.x-Release.zip`包

3.设置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"
```

4.设置好OpenHarmony NDK编译环境后,编译[example](https://gitee.com/from-north-to- ... +%E4%BB%A3%E7%A0%81(Python%E8%B0%83%E7%94%A8c%E6%88%96c++%E7%9A%84so,%E7%B1%BB%E4%BC%BC%E4%BA%8ENAPI)/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
```

![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_1209)

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

执行以下代码:

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

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

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

6.调用so库,最后得到两个数字相加的结果。
![image.png](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_505)
[/md]
作者: zhoasw    时间: 2024-1-16 16:43
我司目前有一款移动终端设备在开发,想用贵司系统,我们CPU是RK3568  ,希望得到贵司的协助,盼复!
作者: 15367314360    时间: 2024-1-18 11:04
请问cpython-3.8_oh_install.tar.xz是怎么从Python源码编译得到的?我看Openharmony的三方库有Python,但是不知道如何使用
作者: frank_code    时间: 2024-9-27 16:57
python3.8 for arm64 OpenHarmony这个文件下载不到了,请问作者还有吗,谢谢




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5