Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Enum C++ dans python

2 réponses
Avatar
Ludo
Bonjour,

Je sais que cette question a probablement une reponse toute faite mais
tout ce que je lis a partir de google me semble bien trop complique pour
ce que je veux faire.

Je travaille dans un projet contenant des tas de packages c++ differents
et des morceaux de codes python.
Pour notre probleme, je travaille sur un bout de python utilisant un
package c++ fourni par un collegue.

Ce que je veux faire c´est pouvoir acceder aux enums contenus dans un
header du package c++ a partir de python.

Bien evidemment je pourrais copier/modifier/coller le header c++ et le
transcrire en python mais ce header est modifie regulierement et
j´aurais aime trouver quelque chose de plus automatique.

Y a-t-il donc :
- soit une commande simple en python permettant de lire directement les
enums contenus dans les .h c++ ?
- soit un outil ligne de commande facile d´installation/utilisation (a
terme, il serait lance automatiquement a la compilation du package c++)
permettant de generer un fichier .py contenant les enums initialement
dans le .h ?

Merci pour toute suggestion.
Ludo.

2 réponses

Avatar
Pierre Maurette
Ludo, le 19/08/2009 a écrit :
Bonjour,

Je sais que cette question a probablement une reponse toute faite mais tout
ce que je lis a partir de google me semble bien trop complique pour ce que je
veux faire.

Je travaille dans un projet contenant des tas de packages c++ differents et
des morceaux de codes python.
Pour notre probleme, je travaille sur un bout de python utilisant un package
c++ fourni par un collegue.

Ce que je veux faire c´est pouvoir acceder aux enums contenus dans un header
du package c++ a partir de python.

Bien evidemment je pourrais copier/modifier/coller le header c++ et le
transcrire en python mais ce header est modifie regulierement et j´aurais
aime trouver quelque chose de plus automatique.

Y a-t-il donc :
- soit une commande simple en python permettant de lire directement les
enums contenus dans les .h c++ ?
- soit un outil ligne de commande facile d´installation/utilisation (a
terme, il serait lance automatiquement a la compilation du package c++)
permettant de generer un fichier .py contenant les enums initialement dans le
.h ?



Bonjour,

J'ai lu avec attention votre message et j'attendais les réponses. En
effet, le sujet m'avait intéressé, juste avant de passer à Python pour
à peu près toute ma tuyauterie, j'avais fait un essai de Ruby sur ce
sujet. Le but était d'extraire les enums puis de générer dans un .c et
un .h des fonctions
const char* f(const int i)
qui affichent le libellé du membre d'enum à partir de sa valeur.
Je m'étais fait aider par un internaute qui aimait les regex. Le truc
marchait à peu près. Mais je me suis amusé à chercher à le piéger avec
des cas (très) tordus, et je le piégeais. Depuis je suis donc passé à
Python, j'utilise parfois le truc sur du code pas trop tordu, au pire
ça prend quelsues secondes de vérifier et corriger la sortie.
Si vous finalisez un truc bien genre extractEnumsFromC() ce serait bien
de le poster ici.

J'ai vu le même fil sur comp.lang.python, mais je ne suis pas à l'aise
en anglais à l'écrit, je ne suis donc pas intervenu. Il me semble qu'il
peut y avoir des problèmes dans les solutions proposées. Par exemple
sur du code comme ça:

#if 0
Ceci est un commentaire à la con !
enum toto
{
zorglub,
frunabulax
};
#endif

ou (c'est un exemple, je pense que c'est assez ballot de localiser des
enums ;-) )

#ifdef FR
enum hello
{
Zero,
One,
Two,
Three,
Five = 5,
Six,
Ten = 10
};
#else
enum hello
{
Zero,
Un,
Deux,
Trois,
Cinq = 5,
Six,
Dix = 10
};
#endif

Une solution serait peut-être de passer au préprocesseur (cpp, gcc -E
si gnu toolchain) les .c (les .h seront automatiquement pris en compte,
dans l'environnement de la compilation ciblée. Il faudrait juste
exclure les #include standards ou hors-projet.

Ce serait très facile d'inclure ce traitement dans Scons. Scons vous
permettant d'appeler vos makefiles existants, et vice-versa. Bon,
j'écrit peut-être ça parce que Scons est mon joujou actuel ;-)

Bonne journée...

--
Pierre Maurette
Avatar
laurent
Ludo wrote:
Bonjour,


Ce que je veux faire c´est pouvoir acceder aux enums contenus dans un
header du package c++ a partir de python.





Y a-t-il donc :
- soit une commande simple en python permettant de lire directement
les enums contenus dans les .h c++ ?
- soit un outil ligne de commande facile d´installation/utilisation
(a terme, il serait lance automatiquement a la compilation du package
c++) permettant de generer un fichier .py contenant les enums
initialement dans le .h ?

Merci pour toute suggestion.
Ludo.



Jettes un oeil à l'outil standard* h2py.py.
Sinon, ctypes propose le couple h2xml.py + xml2py.py, disponibles via le
module ctypeslib (http://pypi.python.org/pypi/ctypeslib).


HTH,

Laurent


* bizarrement de mes deux installations Python 2.5.4, seule la version
windows dispose de h2py.py (C:Python25ToolsScriptsh2py.py)