Créer des extension C/C++ en Python sans Microsoft Visual C++

Il est possible de créer des extensions C/C++ pour Python en utilisant le compilateur libre du projet GNU gcc (en version MinGW pour Windows).

Vous trouverez les instructions (en anglais) pour windows sur cette page: http://sebsauvage.net/python/mingw.html

Cython

Cython utilise une syntaxe proche de Python afin de vous aider à créer une extension C à python.

http://www.cython.org

Python embarqué dans le C

Pour les utilisateurs d'UNIX, il existe une API pour embarquer vos programmes Python dans un programme C, avec le fichier "Python.h". Voir http://www.python.org/doc/current/ext/intro.html [ section ajoutée par Sébastien Castiel <seccas AT altern POINT org> ]

Accès aux Bibliothèques dynamiques en Python

Grâce au module dl, vous pouvez charger dynamiquement des bibliothèques (.so sous UNIX) et appelez des fonctions C ! La documentation est disponible sur: http://docs.python.org/lib/module-dl.html ex:

>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)

Dans ce cas présent, il est préférable d'utiliser le package natif time !

Programme Python embarquant du code C sous Windows avec Visual C++

Un autre exemple http://dosimple.ch/articles/Python-SWIG/

Introduction

Cet exemple permet de créer un executable Python sous Visual C++ embarquant du code C. Ce procédé permet notament de pouvoir tester des librairies C de manière souple à l'aide de script python.

Prérequis

Il faut installer au préalable :

(Note: vous trouverez en bas de cette page une solution pour créer des extensions en C/C++ sans Microsoft Visual C++.)

Fichiers de la commande Python

Créer les fichiers ExempleHfichier et ExempleCfichier, ces fichiers contiennent le code des commandes qui vont être ajoutées à Python.

Fichier d'interface de SWIG

Créer un fichier ExempleIfichier servant au générateur d'interface SWIG, cet utilitaire est un générateur d'interface C pour Python. Il simplifie la connexion de module en C avec le langage Python.

ATTENTION: quand on définit un nom de module les majuscules minuscules sont prises en comptes par le compilateur C++ et par python.

A NOTER: l'inclusion du fichier d'entète ExempleHfichier est faite à deux endroits, la première inclusion est utile au compilateur C++, la deuxième inclusion est utile au générateur d'interface SWIG

Fichier du programme principal

Creer un fichier MainCfichier

REMARQUE: la fonction d'initialisation du module python est composée de 'init' suivi du nom du module défini dans le fichier d'interface ExempleIfichier. Cette fonction doit être impérativement appelée entre la fonction Py_Initialise et Py_Main.

A NOTER: l'ajout de Py_Main bizarrement non défini dans python.h

Creation d'un projet Visual C++

Créer avec Visual C++ un nouveau projet Win32 Console Application le nommer exemple et le placer dans le répertoire exemple_C

Ajouter les fichiers sources ExempleHfichier, ExempleCfichier et MainCfichier

Créer un nouveau dossier dans le projet (touche droite souris et sélectionner New Folder)

Ajouter le fichier ExempleIfichier au projet visual

Configuration du générateur SWIG

Sélectionner dans le menu Projects le sous menu Settings...

Cliquer sur le fichier ExempleIfichier de la boite de dialogue Project Settings

Cliquer sur l'onglet Custom Build

Ajouter dans le champ de saisie Commands la ligne suivante ::

        set SWIGPATH=C:\SWIG
        %SWIGPATH%\swig.exe -python -I%SWIGPATH%\lib\python -I%SWIGPATH%\lib -o $(ProjDir)\$(InputName)_win32.c $(InputPath)

Ajouter dans le champ de saisie Outputs la ligne::

        $(ProjDir)\$(InputName)_win32.c

Le set SWIGPATH=C:\SWIG doit contenir le chemin de SWIG. Cette variable d'environnement peut être ajoutée directement dans le fichier AUTOEXEC.BAT (penser à rebooter dans ce cas)

Cliquer sur le bouton Dependencies

Ajouter les fichiers ExempleHfichier et ExempleIfichier, ils conditionnent la recompilation par SWIG du fichier d'interface ExempleIfichier

Paramètrage du projet

Sélectionner dans le menu Projects le sous menu Settings...

Cliquer sur la racine du projet et cliquer le l'onglet C/C++

Sélectionner dans Category le choix Code generation

Sélectionner dans Use run-time library le choix Multithreaded DLL

Sélectionner dans Category le choix Preprocessor

Supprimer _DEBUG dans le champ de saisie Preprocessor definitions. La suppression de cette définition permet de pouvoir se linker sans problème avec la librairie Python livrée en standard. Si l'on possède la librairie Python de debug, on peut laisser cette définition.

Ajouter si nécessaires les chemins d'accés aux fichiers entètes dans Additional include directories

Paramètrage de Visual C++

Sélectionner le sous menu Options du menu Tools

Sélectionner l'onglet Directories dans la boite de dialogue Options

Sélectionner dans Show directories for: l'option Include files

Ajouter le répertoire contenant le fichier python.h

Sélectionner dans Show directories for: l'option Library files

Ajouter le répertoire contenant le fichier pythonXX.lib, XX correspond à la version de la librairie

REMARQUE: Ce paramêtrage a l'avantage d'être effectué une bonne fois pour toute et n'est valable que sur la machine courante. L'avantage, si l'on change de machine est que si Python n'est pas installé dans le même répertoire, il suffit de positionner ces paramêtres et tous les projets Visual se recompileront et se linkeront sans aucun problème.

Compilation du projet

La première compilation doit générer automatiquement un fichier exemple_win32.c, il faut ajouter ce fichier dans le projet pour pouvoir bénéficier des nouvelles commandes contenues dans le fichier ExempleCfichier

Execution du programme

Pour executer le programme, ouvrir une une fenêtre MS/DOS, se placer sur le répertoire racine du projet et taper ::

        C:\ExempleIfichier\exemple_C>Debug\exemple.exe

Les lignes suivantes apparaissent ::

Python 2.1.1 (#20, Jul 20 2001, 01:19:29) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
>>>

Une nouvelle commande Python se dénomant command est intégrée à ce programme, celle ci appartient à un module Python se dénomant exemple (le nom du module est défini dans le fichier ExempleIfichier).

Pour pouvoir exécuter cette commande il faut impérativement importer ce module ::

>>> import exemple
>>>

Ensuite il suffit d'exécuter la nouvelle commande ::

>>> exemple.command (1,"One")
integer : 1
string  : One
1
>>>

WikiPythonFr: InterfaceAvecLangage (last edited 2012-09-20 13:24:41 by william)