[PYTHON] Rufen Sie den von Cython aus C / C ++ (Mac-Version) generierten Code auf.

Heute

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.

Bereiten Sie den Cython-Code vor

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"))

Codegenerierung

$ python setup.py build_ext --inplace

Auf diese Weise sollte "cytest.h" "cytest.c" erzeugt werden.

Code erstellen

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.

Bevor wir bauen

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.

スクリーンショット 0029-11-15 午後6.53.57.png

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.

スクリーンショット 0029-11-15 午後6.57.14.png

Du hast es gefunden.

Lass uns bauen

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

Rufen Sie den von Cython aus C / C ++ (Mac-Version) generierten Code auf.
Rufen Sie den von Cython aus C / C ++ (Windows-Version) generierten Code auf.
Rufen Sie C / C ++ von Python auf dem Mac auf
Rufen Sie C von Python mit DragonFFI auf
Rufen Sie popcount von Ruby / Python / C # auf
Führen Sie Python-Code über die C # -GUI aus
Holen Sie sich eine Adresse aus einer Postleitzahl
Rufen Sie die c-Sprache von Python aus auf (python.h)
Installieren Sie, indem Sie die Version mit pip angeben
Lesen Sie die Datei, indem Sie den Zeichencode angeben.
Aufrufbefehle von Python (Windows Edition)
Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.