La réponse de Chinmay Kanchi est excellente mais je voulais un exemple de fonction qui passe et retourne des variables / tableaux à un code C ++. J'ai pensé l'inclure ici au cas où cela serait utile à d'autres.
Passer et renvoyer un entier
Le code C ++ d'une fonction qui prend un entier et en ajoute un à la valeur retournée,
extern "C" int add_one(int i)
{
return i+1;
}
Enregistré en tant que fichier test.cpp
, notez l' externe "C" requis (il peut être supprimé pour le code C). Ceci est compilé en utilisant g ++, avec des arguments similaires à la réponse de Chinmay Kanchi,
g++ -shared -o testlib.so -fPIC test.cpp
Le code Python utilise à load_library
partir de l' numpy.ctypeslib
hypothèse du chemin d'accès à la bibliothèque partagée dans le même répertoire que le script 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)
Cela imprime 6 comme prévu.
Passer et imprimer une matrice
Vous pouvez également passer des tableaux comme suit, pour qu'un code C imprime l'élément d'un tableau,
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
qui est compilé comme avant et importé de la même manière. Le code Python supplémentaire pour utiliser cette fonction serait alors,
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)
où nous spécifions le tableau, le premier argument vers print_array
, comme un pointeur vers un tableau Numpy de flottants alignés, c_contiguous 64 bits et le deuxième argument comme un entier qui indique au code C le nombre d'éléments dans le tableau Numpy. Ceci est ensuite imprimé par le code C comme suit,
1.4
2.6
3.0
>>>
dans importtest.py? Lorsque les gens publient le code qui a>>>
sur chaque ligne, cela signifie qu'il est exécuté dans le shell interactif. Pour l'exécuter à partir d'un fichier, supprimez>>>
(c'est 3> signes et un espace) partout où il apparaît.