J'ai écrit l'autre jour
Appelez le code généré par Cython à partir de C / C ++ (version Windows)
Essayons la version Mac de. On suppose que Python utilise l'un des environnements de pyenv.
Créons une fonction qui définit une structure de vertex et renvoie une structure de vertex dont les coordonnées sont doublées.
cytest.pyx
cdef public struct Point:
double x
double y
cdef public Point DoubleCoord(Point p):
cdef Point q
q.x=2*p.x
q.y=2*p.y
return q
Préparez également setup.py
.
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("cytest.pyx"))
$ python setup.py build_ext --inplace
En faisant cela, cytest.h`` cytest.c
doit être généré.
Écrivons le code comme ci-dessous.
call.c
#include <stdio.h>
#include <Python.h>
#include "cytest.h"
int main(int argc, char const *argv[])
{
Py_Initialize();
struct Point p;
p.x=3.0;
p.y=4.0;
struct Point q = DoubleCoord(p);
printf("Hello\n");
printf("q.x=%f,q.y=%f\n",q.x,q.y);
Py_Finalize();
/* code */
return 0;
}
Une chose à noter ici est que vous devez inclure Python.h
avant d'inclure cytest.h
.
error: unknown type name 'PyMODINIT_FUNC'
Je me mets en colère.
Ici, nous allons essayer le cas de 3.5.4 dans l'environnement pyenv.
$ pyenv global
3.5.4
Vous devez d'abord savoir où se trouve le Python.h
.
Comme conclusion
$HOME/.pyenv/versions/3.5.4/include/python3.5m
Ensuite, si vous le regardez avec Finder, vous verrez que les fichiers d'en-tête sont alignés.
Rinka cherche la bibliothèque, je dois donc lui indiquer l'emplacement. Il y a lib
dans le même calque que ʻinclude`, alors jetons un œil ici.
Tu l'as trouvé.
Comment utiliser le compilateur (commande gcc)
Écrivons-le en référence à.
gcc -Wall -I $HOME/.pyenv/versions/3.5.4/include/python3.5m -L $HOME/.pyenv/versions/3.5.4/lib -lpython3.5m call.c cytest.c
Ensuite, le fichier exécutable ʻa.out` sera créé.
$ ./a.out
Hello
q.x=6.000000,q.y=8.000000
Il a été confirmé que les coordonnées des sommets étaient doublées. Vous pouvez désormais appeler Python à partir de C / C ++ et vice versa via Cython, vous pouvez donc travailler dans n'importe quelle direction.
Recommended Posts