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

Aujourd'hui

Présentation de l'utilisation de Cython pour appeler Python à partir de C / C ++.

Il est courant d'écrire un fossé extérieur en Python et d'appeler la partie principale C / C ++ pour accélérer. Cette fois, c'est ** inverse **. Au contraire, il n'y a pas grand chose d'autre que le document officiel ... Veuillez me faire savoir si vous en avez. OTL.

(Ajout: j'ai écrit la version Mac.)

environnement

Créer un environnement avec Visual Studio

Création de solution

project.png

Visual C ++ -> Sélectionnez un projet vide-> Appuyez sur le bouton OK pour le moment. Vous pouvez maintenant créer un projet vide. La solution et le nom du premier projet créé est Project1.

Ajouter du code au fichier source

Ajoutez un fichier C ++ vide avec Ctrl + Maj + A. Le nom par défaut est Source.cpp, mais utilisez-le tel quel. Nous écrirons le code dans Source.cpp plus tard. Pour l'instant, laissez ce champ vide.

Connaître l'emplacement de Python

Veuillez noter qu'à partir de maintenant, cela dépendra de votre propre environnement.

Je pense que les lecteurs sont familiers avec Python, vous savez donc quel Python vous utilisez. Mais vérifions.

Ouvrez une invite de commande

> where python

Est exécuté. Dans mon cas, c'était C: \ ProgramData \ Miniconda3 \ python.exe.

Allez dans C: \ ProgramData \ Miniconda3. Dans l'image ci-dessous, ʻinclude et libs` sont sélectionnés. pythonhome.png

Notez le chemin de ce répertoire car il sera utilisé ensuite.

Édition de propriété

Ajoutez le chemin complet de include noté ci-dessus à Propriétés> Répertoire VC ++> Répertoire d'inclusion. Dans mon cas C: \ ProgramData \ Miniconda3 \ include est.

Ajoutez le chemin complet des bibliothèques indiquées ci-dessus à Propriétés> Répertoire VC ++> Répertoire d'inclusion. Dans mon cas C: \ ProgramData \ Miniconda3 \ libs est.

Faisons ressembler le cadre rouge entouré par la figure ci-dessous. Définissez également la plate-forme sur x64.

propety.png

Introduction de binaires de débogage et de symboles de débogage

Obtenez le programme d'installation sur la page d'accueil officielle de Python et lancez le programme d'installation. Cliquez sur Personnaliser l'installation, puis sur le bouton Suivant. install.png next.png debug.png

Vérifiez les binaires de débogage de téléchargement, les symboles de débogage. Si vous n'utilisez pas ce Python comme principal, vous n'avez pas besoin d'ajouter PATH.

Vérification de la construction

Écrivez ce qui suit dans Source.cpp

source.cpp


#include<Python.h>
int main() {
	Py_Initialize();
	printf("Hello");
	Py_Finalize();
	return 0;
}

Si vous pouvez construire en mode version, c'est OK pour le moment. Si vous vous fâchez que Python.h soit manquant, l'ajout du répertoire d'inclusion a échoué. Calmons-nous et remettons-le.

Et en mode débogage, vous avez besoin d'une DLL portant le même nom que python35_d.lib, vous devez donc l'obtenir.

Vous pouvez l'obtenir en démarrant le programme d'installation de Python 3 à partir de la page officielle de Python en vous référant au débordement de pile ci-dessus et en sélectionnant "télécharger les binaires de débogage" comme option. Trouvons-le.

Création de code Cython

Créez ce qui suit dans le même calque que Source.cpp créé ci-dessus.

Chaque code est le suivant.

setup.py


from distutils.core import setup 
from Cython.Build import cythonize

setup(ext_modules=cythonize("cytest.pyx"))

cytest.pyx


from libc.stdio cimport printf

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*q.x
    printf("q.x=%f, q.y=%f\n",q.x,q.y)
    return q

Pour le moment, j'ai créé une fonction avec Cython qui définit la structure des sommets et double les coordonnées.

setup Ouvrez une invite de commande et créez votre code Cython.

> python setup.py build_ext --inplace

Code généré ajouté

Généré à ce moment Ajoutez respectivement cytest.c cytest.h au fichier source et au fichier d'en-tête de Visual Studio.

Modifier Source.cpp

Source.cpp


#include<Python.h>
#include<stdio.h>
#include "cytest.h"

int main() {
	Py_Initialize();
	struct Point p;
	p.x = 3.5;
	p.y = 7.0;
	struct Point q = DoubleCoord(p);
	printf("q.x=%f,q.y=%f", q.x, q.y);
	Py_Finalize();
}

Par conséquent, jusqu'à présent, cela devrait être comme indiqué dans la figure ci-dessous sur Visual Studio.

vstotal.png

Une fois exécuté, ce sera comme suit.

result.png

finalement

C'est dur ... Pour référence

Je vais mentionner.

Recommended Posts

Appeler le code généré par Cython à partir de C / C ++ (version Windows)
Appeler le code généré par Cython à partir de C / C ++ (version Mac)
Appeler des commandes depuis Python (édition Windows)
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 C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
Téléchargez le fichier en spécifiant la destination de téléchargement avec Python & Selemiun & Chrome (version Windows)
Installer en spécifiant la version avec pip
Lisez le fichier en spécifiant le code de caractère.
Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.