Chinmay Kanchi'nin cevabı mükemmel ancak değişkenleri / dizileri C ++ koduna geçiren ve döndüren bir işlev örneği istedim. Başkaları için yararlı olması durumunda buraya eklemeyi düşündüm.
Bir tamsayı geçirme ve döndürme
Bir tamsayı alan ve döndürülen değere bir ekleyen bir işlevin C ++ kodu,
extern "C" int add_one(int i)
{
return i+1;
}
Dosya olarak kaydedildiğinde test.cpp
, gerekli harici "C" yi not edin (bu, C kodu için kaldırılabilir). Bu, Chinmay Kanchi cevabına benzer argümanlarla g ++ kullanılarak derlenmiştir,
g++ -shared -o testlib.so -fPIC test.cpp
Python kodu kullanımları load_library
gelen numpy.ctypeslib
Python komut ile aynı dizinde paylaşılan kitaplığa varsayarak yola,
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)
Bu beklendiği gibi 6 yazdırır.
Bir diziyi iletme ve yazdırma
Ayrıca dizileri aşağıdaki gibi iletebilirsiniz, bir C kodunun bir dizinin öğesini yazdırması için,
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
daha önce olduğu gibi derlenir ve aynı şekilde içe aktarılır. Bu işlevi kullanmak için ekstra Python kodu şu şekilde olacaktır:
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)
burada print_array
diziyi, hizalanmış bir Numpy dizisine işaretçi olarak ilk argüman , c_contiguous 64 bit kayar ve ikinci argüman C koduna Numpy dizisindeki elemanların sayısını söyleyen bir tamsayı olarak belirtiriz. Bu daha sonra aşağıdaki gibi C kodu ile yazdırılır,
1.4
2.6
3.0
>>>
importtest.py içinde? İnsanlar>>>
her satırda bulunan kodu gönderdiklerinde, bu, etkileşimli kabukta çalıştırıldığını gösterir. Bir dosyadan çalıştırmak için,>>>
göründüğü her yerden kaldırın (bu 3> işaret ve boşluktur).