Sommaire
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.
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 :
- - Visual C++ 6
- Python pour windows (http://www.python.org)
- Swig.exe pour windows (http://www.swig.org)
(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)
- Nom : Swig interface
- Extension : *.i
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 >>>