คำตอบของ Chinmay Kanchi นั้นยอดเยี่ยม แต่ฉันต้องการตัวอย่างของฟังก์ชันที่ส่งผ่านและส่งคืนตัวแปร / อาร์เรย์ไปยังรหัส C ++ ฉันจะรวมไว้ที่นี่เผื่อว่าจะเป็นประโยชน์กับคนอื่น ๆ
การส่งผ่านและส่งคืนจำนวนเต็ม
รหัส C ++ สำหรับฟังก์ชันที่รับจำนวนเต็มและเพิ่มหนึ่งในค่าที่ส่งคืน
extern "C" int add_one(int i)
{
return i+1;
}
บันทึกเป็นไฟล์test.cpp
ให้สังเกต"C" ภายนอกที่ต้องการ (ซึ่งสามารถลบออกได้สำหรับรหัส C) สิ่งนี้รวบรวมโดยใช้ g ++ โดยมีอาร์กิวเมนต์คล้ายกับคำตอบของ Chinmay Kanchi
g++ -shared -o testlib.so -fPIC test.cpp
รหัส Python ใช้load_library
จากการnumpy.ctypeslib
สมมติว่าพา ธ ไปยังไลบรารีที่ใช้ร่วมกันในไดเร็กทอรีเดียวกันกับสคริปต์ Python
import numpy.ctypeslib as ctl
import ctypes
libname = 'testlib.so'
libdir = './'
lib=ctl.load_library(libname, libdir)
py_add_one = lib.add_one
py_add_one.argtypes = [ctypes.c_int]
value = 5
results = py_add_one(value)
print(results)
สิ่งนี้พิมพ์ได้ 6 ตามที่คาดไว้
การส่งและการพิมพ์อาร์เรย์
คุณยังสามารถส่งผ่านอาร์เรย์ดังต่อไปนี้สำหรับรหัส C เพื่อพิมพ์องค์ประกอบของอาร์เรย์
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
ซึ่งรวบรวมเหมือนก่อนหน้านี้และนำเข้าในลักษณะเดียวกัน รหัส Python พิเศษที่จะใช้ฟังก์ชันนี้จะเป็น
import numpy as np
py_print_array = lib.print_array
py_print_array.argtypes = [ctl.ndpointer(np.float64,
flags='aligned, c_contiguous'),
ctypes.c_int]
A = np.array([1.4,2.6,3.0], dtype=np.float64)
py_print_array(A, 3)
โดยที่เราระบุอาร์เรย์ซึ่งเป็นอาร์กิวเมนต์แรกprint_array
เป็นตัวชี้ไปยังอาร์เรย์ Numpy ของการจัดตำแหน่ง c_contiguous 64 บิตลอยและอาร์กิวเมนต์ที่สองเป็นจำนวนเต็มซึ่งจะบอกรหัส C ถึงจำนวนขององค์ประกอบในอาร์เรย์ Numpy จากนั้นพิมพ์โดยรหัส C ดังนี้
1.4
2.6
3.0
>>>
ใน importtest.py หรือไม่? เมื่อมีคนโพสต์รหัสที่มี>>>
ในแต่ละบรรทัดหมายความว่ากำลังรันในเชลล์แบบโต้ตอบ หากต้องการเรียกใช้จากไฟล์ให้ลบ>>>
(นั่นคือ 3> เครื่องหมายและช่องว่าง) ทุกที่ที่ปรากฏ