[PYTHON] Appeler le code généré par Cython à partir de C / C ++ (version Mac)

Aujourd'hui

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.

Préparer le code Cython

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

Génération de code

$ python setup.py build_ext --inplace

En faisant cela, cytest.h`` cytest.c doit être généré.

Création de code d'appel

É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.

Avant de construire

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.

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

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.

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

Tu l'as trouvé.

Construisons

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

Appeler le code généré par Cython à partir de C / C ++ (version Mac)
Appeler le code généré par Cython à partir de C / C ++ (version Windows)
Appeler C / C ++ depuis Python sur Mac
Appeler C depuis Python avec DragonFFI
Appeler popcount depuis Ruby / Python / C #
Exécuter du code Python à partir de l'interface graphique C #
Obtenir une adresse à partir d'un code postal
Appeler le langage C depuis Python (python.h)
Installer en spécifiant la version avec pip
Lisez le fichier en spécifiant le code de caractère.
Appeler des commandes depuis Python (édition Windows)
Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.