Ich habe neulich geschrieben
Rufen Sie den von Cython aus C / C ++ (Windows-Version) generierten Code auf
Probieren wir die Mac-Version von aus. Es wird angenommen, dass Python eine der Umgebungen in pyenv verwendet.
Erstellen wir eine Funktion, die eine Scheitelpunktstruktur definiert und eine Scheitelpunktstruktur zurückgibt, deren Koordinaten verdoppelt werden.
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
Bereiten Sie auch setup.py
vor.
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("cytest.pyx"))
$ python setup.py build_ext --inplace
Auf diese Weise sollte "cytest.h" "cytest.c" erzeugt werden.
Schreiben wir den Code wie folgt.
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;
}
Eine Sache, die hier zu beachten ist, ist, dass Sie "Python.h" einschließen müssen, bevor Sie "cytest.h" einschließen.
error: unknown type name 'PyMODINIT_FUNC'
Ich werde böse.
Hier werden wir den Fall von 3.5.4 in der Pyenv-Umgebung versuchen.
$ pyenv global
3.5.4
Zuerst müssen Sie herausfinden, wo sich die Python.h befindet. Als Schlussfolgerung
$HOME/.pyenv/versions/3.5.4/include/python3.5m
Wenn Sie es mit Finder betrachten, werden Sie sehen, dass die Header-Dateien in einer Reihe stehen.
Rinka sucht nach der Bibliothek, also muss ich ihr den Ort mitteilen. Es gibt "lib" in derselben Ebene wie "include", also schauen wir uns das hier an.
Du hast es gefunden.
Verwendung des Compilers (Befehl gcc)
Schreiben wir es mit Bezug auf.
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
Dann wird die ausführbare Datei "a.out" erstellt.
$ ./a.out
Hello
q.x=6.000000,q.y=8.000000
Es wurde bestätigt, dass die Scheitelpunktkoordinaten verdoppelt wurden. Jetzt können Sie Python von C / C ++ und umgekehrt über Cython aufrufen, sodass Sie aus jeder Richtung arbeiten können.
Recommended Posts