[PYTHON] Module C++ pour python

Module C++ pour python [PYTHON] - Python - Programmation

Marsh Posté le 14-02-2011 à 16:28:41    

Bonjour à tous !
 
Pour ce qui va suivre, je débute seulement en compilation et partage de librairies sur unix, donc je vais peut être dire des trucs à la con donc m'en voulez pas  :D. Pour la petite introduction, j'ai codé un script de post-traitement en python qui exporte de fichiers en ASCII (pour Tecplot, si ça parle à certains). J'utilise désormais un volume de données de plus en plus important et je voulais donc passer au format binaire pour gagner du temps d'écriture et de la place.
 
Pour le format binaire, tecplot offre gracieusement les sources de ses fonctions I/O, écrites en C++. Ces sources sont livrées avec un petit makefile créant une librairie statique .a . J'avais en guise d'aide un code fortran utilisant déjà cette librairie, du coup sans trop me casser la tête, j'ai écrit une subroutine fortran utilisant cette librairie, je l'ai passée à la moulinette f2py, et au final j'obtiens un script python qui appelle un module fortran utilisant une librairie C++, qui marche sans trop de problème.
 
Avec un peu de recul, et en voyant un peu ce qui existe à coté comme SWIG, ctypes, etc, et surtout que f2py utilise du C, je me dis qu'il y a peut être moyen de faire un truc plus propre, et surtout plus flexible.
 
En détail, j'ai environ 20 fichiers .cpp qu'un makefile compile avec la commande suivante (plus parfois l'option entre parenthèses) :

Code :
  1. g++ -fPIC -DLINUX -DLINUX64  -DUSEENUM -DTHREED (-DMAKEARCHIVE) -c arrlist.cpp


puis tous les fichiers .o obtenus sont empaquetés dans une librairie statique .a.
 
J'ai essayé rapidement SWIG, mais il me détecte des erreurs de syntaxe dans les fichiers .h... Vu que le C++ n'est pas du tout mon fort, je suis donc venu ici pour demander à des habitués s'il y a une façon simple que je ne vois/connais pas d'appeler directement les fonctions I/O dans le script python... :)
 
Merci d'avance !

Reply

Marsh Posté le 14-02-2011 à 16:28:41   

Reply

Marsh Posté le 15-02-2011 à 14:38:57    

Après un peu de recherche dans le code et sur internet, mon problème de syntaxe avec SWIG apparaît à chaque ligne où se trouve la commande STDCALL.
D'après ce que j'ai pu comprendre, c'est une fonction qui n'est utile que pour windows.
 
Si ça parle à quelqu'un, est ce que je peux directement commenter ces lignes dans les fichiers header ? Sinon j'ai vu qu'il y avait moyen de faire une nouvelle définition de STDCALL dans le fichier d'interface avec des lignes (qui ne me parlent pas du tout :sweat: ) du genre :

Code :
  1. #ifndef STDCALL
  2. #define STDCALL __attribute__((stdcall))
  3. #endif


mais ça ne change pas mon problème d'erreur de syntaxe...

Reply

Marsh Posté le 15-02-2011 à 17:53:31    

poste tes messages d'erreurs, ca ne fera pas de mal


---------------
last.fm
Reply

Marsh Posté le 16-02-2011 à 16:26:42    

Ok alors dans le détails voici les fichiers, commandes et erreurs que j'ai (et que j'ai testés depuis) :
 
Le fichier d'interface principal :

Code :
  1. // tecio interface
  2. %module tecio
  3. %{
  4. %}
  5. %include ALLOC.i
  6. %include ARRLIST.i
  7. [....une quinzaine d'autres include...]
  8. %include TranslatedString.i
  9. %include VERSION.i


Avec pour chaque fichier *.i :

Code :
  1. %{
  2. #include <ARRLIST.h>
  3. %}
  4. [...copie du fichier ARRLIST.h]


 
Je lance alors la commande suivante :  

Code :
  1. swig -python -c++ tecio.i


Qui me renvoie alors l'erreur :

Code :
  1. ARRLIST.i:295: Error: Syntax error in input(2).


La ligne en question :

Code :
  1. typedef int (STDCALL *ArrayListItemComparator_pf)(ArrayListItem_u Item1, ArrayListItem_u Item2, ArbParam_t      ClientData);


 
Enfin, si je commente cette ligne, swig détecte une nouvelle erreur de syntaxe à la prochaine occurrence de STDCALL, et ainsi de suite (avec une autre fonction TP_IN_OUT aussi je crois...).
Bref j'ai commenté toutes ces lignes à la main vu qu'il n'y en avait qu'une dizaine, j'ai relancé la commande, et la commande swig est bien passée mais avec les warning suivants :

Code :
  1. TranslatedString.i:193: Warning(362): operator= ignored
  2. STRUTIL.i:222: Warning(509): Overloaded method EndOfString(char const *) is shadowed by EndOfString(char *) at STRUTIL.i:218.
  3. TranslatedString.i:176: Warning(503): Can't wrap 'operator std::string' unless renamed to a valid identifier.


 
Là tout content je regarde ce qu'il m'a crée, et j'ai ces 2 fichiers :

Code :
  1. tecio.py
  2. tecio_wrap.cxx


 
Ca ne correspond pas tellement au tutorial de swig où il est sensé me créer deux fichiers .c, mais admettons, je tente de compiler le *_wrap.c avec la commande (j'ai essayé gcc et g++):

Code :
  1. gcc -fpic -I/usr/include/python2.6 -c tecio_wrap.cxx


Et là c'est le drame, une avalanche de message d'erreur du genre :

Code :
  1. [...]
  2. tecio_wrap.cxx: In function â:
  3. tecio_wrap.cxx:22495: error: â was not declared in this scope
  4. tecio_wrap.cxx:22495: error: â was not declared in this scope
  5. tecio_wrap.cxx:22495: error: expected primary-expression before â token
  6. tecio_wrap.cxx:22495: error: expected â before numeric constant
  7. tecio_wrap.cxx:22496: error: â was not declared in this scope
  8. tecio_wrap.cxx:22496: error: expected â before â
  9. tecio_wrap.cxx:22509: error: expected type-specifier before â
  10. tecio_wrap.cxx:22509: error: expected â before â
  11. [...]


 
Avec toujours ce "â" sur toutes les lignes... Une erreur d'encodage ?
Et également le fichier python *.py que je ne sais pas comment utiliser...
 
Voilà toute l'histoire, si ça peut vous aider !  :sweat:  
 

Reply

Marsh Posté le 15-04-2011 à 21:53:34    

Un petit up pour dire que mon problème de compilation a été résolu, grâce notamment à une petite formation en C++  :sarcastic:  
 
Si ça en intéresse certains je pourrais poster les détails...
 
Et du coup, j'en profite pour vous soumettre un autre problème suite à l'utilisation de ce nouveau module...  :ange:  
J'ai donc pu charger mon module dans python sans problème, mais à l'appel de la fonction de ce module, j'ai une erreur de conversion de type. En détail ça donne ça pour la fonction en C :

Code :
  1. #include TECIO.h
  2. INTEGER4 TECINI112(char *Title,
  3. char *Variables,
  4. char *FName,
  5. char *ScratchDir,
  6. INTEGER4 *FileType,
  7. INTEGER4 *Debug
  8. INTEGER4 *VIsDouble);


 
Et quand je l'utilise une fois wrappée avec SWIG dans python j'obtiens :

Code :
  1. >>> tecio.tecini112("TITRE", "x y z", "file.out", ".", 0, 1, 1)
  2. Traceback (most recent call last):
  3.   File "<stdin>", line 1, in <module>
  4. TypeError: in method 'tecini112', argument 5 of type 'int *'


La dernière ligne est écrite par SWIG qui fait des contrôles de conversion des variables entre le C et le python, et ce que je pense comprendre, c'est qu'il n'a pas réussi à convertir un integer python en pointeur C... Ca m'a l'air louche...  
(Je peux poster le code de conversion de SWIG, mais a priori ce sont ses fonctions standards..)
 
Si ça vous inspire, même pour me donner une direction où chercher, je suis preneur, merci !
 
 
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed