Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
exemple_python_cpp [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


exemple_python_cpp

Warning: Undefined array key 5 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1453

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
exemple_python_cpp [2013/10/18 07:38]
tyrtamos créée
exemple_python_cpp [2013/10/18 07:58]
tyrtamos
Ligne 4: Ligne 4:
  
 Python prévoit de pouvoir appeler directement un code en C ou en C++ avec distutils. Le mécanisme nécessaire pour ça est assez logique mais assez complexe au niveau syntaxe. La présente page traite un exemple simple en C++. Python prévoit de pouvoir appeler directement un code en C ou en C++ avec distutils. Le mécanisme nécessaire pour ça est assez logique mais assez complexe au niveau syntaxe. La présente page traite un exemple simple en C++.
 +
 +Documentation pour Python 2.7: [[http://docs.python.org/2/extending/]]
 +
 +C'est écrit pour Python 2.7, mais la conversion pour Python 3.3 ne devrait pas poser de problème.
 +
 +Documentation pour Python 3.3: [[http://docs.python.org/3/extending/]]
  
 ===== Préparation du code C++ ===== ===== Préparation du code C++ =====
Ligne 13: Ligne 19:
 Ecrits en code C++ simple, voici les codes, placés dans un même fichier: **testext.cpp**: Ecrits en code C++ simple, voici les codes, placés dans un même fichier: **testext.cpp**:
  
-<code> +<code cpp>
-//###########################################################################+
 // fonction 'fact' en C++ // fonction 'fact' en C++
  
Ligne 23: Ligne 28:
     };     };
  
-//########################################################################### 
 // fonction 'pgcd' en C++ // fonction 'pgcd' en C++
  
Ligne 41: Ligne 45:
 1- inclure l'en-tête python.h 1- inclure l'en-tête python.h
  
-<code>+<code cpp>
 #include "Python.h" #include "Python.h"
 </code> </code>
Ligne 47: Ligne 51:
 2- placer un code d'initialisation du module, qui sera exécuté par Python lors de l'importation: 2- placer un code d'initialisation du module, qui sera exécuté par Python lors de l'importation:
  
-<code>+<code cpp>
 PyMODINIT_FUNC inittestext(void) { PyMODINIT_FUNC inittestext(void) {
     Py_InitModule("testext", testextMethods);     Py_InitModule("testext", testextMethods);
Ligne 57: Ligne 61:
 3- placer le code qui va donner les objets disponibles du module: 3- placer le code qui va donner les objets disponibles du module:
  
-<code>+<code cpp>
 static PyMethodDef testextMethods[] = { static PyMethodDef testextMethods[] = {
         {"fact", testext_fact, METH_VARARGS},         {"fact", testext_fact, METH_VARARGS},
Ligne 68: Ligne 72:
  
 Pour la fonction "fact": Pour la fonction "fact":
-<code> +<code cpp>
-//===========================================================================+
 // encapsulation de la fonction 'fact' pour utilisation par Python // encapsulation de la fonction 'fact' pour utilisation par Python
  
Ligne 81: Ligne 84:
  
 Et pour la fonction "pgcd": Et pour la fonction "pgcd":
-<code> +<code cpp>
-//===========================================================================+
 // encapsulation de la fonction 'pgcd' pour utilisation par Python // encapsulation de la fonction 'pgcd' pour utilisation par Python
  
Ligne 162: Ligne 164:
 Malgré tout, ce ne sont que des exemples simples et purement numériques. Pour des codes plus complexes, il faudra faire un peu attention, en particulier au points suivants: Malgré tout, ce ne sont que des exemples simples et purement numériques. Pour des codes plus complexes, il faudra faire un peu attention, en particulier au points suivants:
   * en cas d'allocation mémoire en C++, il ne faudra pas oublier de supprimer avant de sortir.   * en cas d'allocation mémoire en C++, il ne faudra pas oublier de supprimer avant de sortir.
-  * en cas d'intervention directe sur les variables Python par le C++, attention aux compteurs de référence+  * en cas d'intervention directe sur les variables Python par le C++, attention aux compteurs de référence (il y a des macros pour incrémenter et décrémenter ces compteurs)
  
-Voilà le setup.py nécessaire à la compilation:+Voilà le "**setup.py**" nécessaire à la compilation:
  
 <code python> <code python>
Ligne 172: Ligne 174:
  
 from distutils.core import setup, Extension from distutils.core import setup, Extension
- 
  
 ext_modules = [Extension('testext',  ext_modules = [Extension('testext', 
Ligne 185: Ligne 186:
      )      )
 </code> </code>
 +
 +Vous voyez que le choix du "C++" est signalé dans le setup
  
 ===== Compilation ===== ===== Compilation =====
Ligne 194: Ligne 197:
 </code> </code>
  
-Attention sous Windows: choix du compilateur+Attention sous Windows: **//choix du compilateur//**
  
-Python prendra le compilateur par défaut. Si vous avez Visual Studio de Microsoft, c'est lui qui sera utilisé (ça fonctionne très bien!). Mais si vous voulez MinGW au lieu de VS, il y a 2 choses à faire:+Python prendra le compilateur par défaut. Si vous avez Visual Studio de Microsoft (comme moi), c'est lui qui sera utilisé (ça fonctionne très bien!). Mais si vous voulez MinGW au lieu de Visual Studio, il y a 2 choses à faire:
  
-1- créer un fichier texte "setup.cfg" contenant:+1- créer un fichier texte "**setup.cfg**placé au même niveau que setup.py, et contenant:
  
 <code> <code>
Ligne 205: Ligne 208:
 </code> </code>
  
-2 corriger le fichier C:\Python27\Lib\distutils\cygwinccompiler.py pour retirer toute mention de l'option -mno-cygwin si elle génère une erreur.+2corriger le fichier C:\Python27\Lib\distutils\cygwinccompiler.py pour retirer toute mention de l'option "-mno-cygwinsi elle génère une erreur.
  
 Moyennant quoi, chez moi, ça marche avec les 2 compilateurs. Moyennant quoi, chez moi, ça marche avec les 2 compilateurs.
exemple_python_cpp.txt · Dernière modification: 2013/10/18 19:04 de tyrtamos