Passing arrays จาก Python ไปยัง C / C++

ขั้นตอนแรก

สร้าง code ภาษา C  สมมุติว่าบันทึกและตั้งชื่อว่า copy_array.c

#include <stdio.h>

void copy_array(unsigned int* arr2d, int rows,int cols){
 unsigned int arr[rows][cols];
 for (int r=0;r < rows;r++){
  for(int c=0;c < cols;c++){   
   int inx = 2*r+c;
   arr[r][c] = arr2d[inx] ;
   printf("%d ", arr[r][c]);   
  }
  printf("\n");
 }
 printf("\n");
}


ขั้นตอนที่สอง 
เปลี่ยน c code เป็น Shared Library


g++ -c copy_array.c -o copy_array.o

จะได้ผลออกมาเป็น object file ชื่อ copy_array.o ต่อไปก็ทำการเปลี่ยนให้เป็น Shared library file


g++ -share copy_array.o -o copy_array.so

จะได้ผลออกมาเป็น Shared library file ชื่อ copy_array.so


ขั้นตอนที่สาม
เป็นเรียกใช้ Shared library ในภาษา Python ด้วย ctypes

import numpy as np
import ctypes

lib = ctypes.cdll.LoadLibrary("./copy_array.so")

a = np.array([[10,20,12,4,5,1]])
aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
lib.copy_array(aptr,3,2)
print(a)


ctypes คือ foreign function library  เป็น Standard library (ติดตั้งมากับ Python Interpreter แล้ว) ที่ช่วยอำนวยความสะดวกในการเรียกใช้หรือส่งค่าตัวแปรระหว่าง Python กับ DLL (Windows) หรือ Shared Library (Linux)

เริ่มด้วยการ load ตัว shared library เข้ามาใน Python และกำหนดตัวแปรอ้างอิง เนื่องจาก Python เป็น OOP การเข้าถึง function ที่อยู่ภายใต้ Shared library จะใช้รูปแบบเดียวกับการใช้งาน Object ทั่วไป

lib = ctypes.cdll.LoadLibrary("./copy_array.so")


ข้ามไปดูคำสั่ง

aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_int))

ชุดคำสั่งนี้เป็นการนำค่า pointer ที่ชี้ไปยัง address ของตัวแปร "a" ที่ถูกสร้างไว้เป็น numpy array ของ integer เนื่องจากทางด้านภาษา C จะรับค่าเป็น pointer


lib.copy_array(aptr,3,2)

และในชุดคำสั่งนี้เป็นการเรียกใช้งาน function พร้อมกับส่ง parameters ไปให้ทำการประมวลผล




ความคิดเห็น