Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Interfaçage autre langage
Interfaçage autre langage Forum d'entraide pour l'interfaçage avec d'autres langages (ctypes, api C, swig, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/07/2011, 15h16   #1
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Par défaut Importer un objet c++ vers Python

Bonjour,

Non sans quelque difficulté, je suis parvenu à exporter des classes c++ vers du python grace à SWIG. J'aimerais maintenant exposer aux scripts Python une instance de l'une de ces classes, créée par une partie du code c++.

Quelles sont les options possibles ? (Je connais peu python) Puis-je en faire une variable globale ? Dois-je l'exposer dans un module ? Quelles fonctions de l'API me seraient utiles pour ça ?
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 10h43   #2
Alexis.M
Membre chevronné
 
Alexis
Doctorant en informatique
Inscription : juin 2009
Messages : 428
Détails du profil
Informations personnelles :
Nom : Alexis
Localisation : France

Informations professionnelles :
Activité : Doctorant en informatique

Informations forums :
Inscription : juin 2009
Messages : 428
Points : 700
Points : 700
Je ne comprends pas bien ce que tu souhaites, si tu as "wrappé" tes classes avec swig elles sont accessibles depuis python.

Si c'est une fonction particulière qui crée la classe il suffit de la "wrapper" également et de l'appeler dans le code python.

Peut-être une explication un peu plus fine de ton problème est-elle nécessaire.
Alexis.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 11h14   #3
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
L'instance existe déjà et n'a pas été crée par le script Python. Je veux permettre au script d'y accéder. (A travers une instance d'une proxy class par exemple)
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 10h36   #4
Alexis.M
Membre chevronné
 
Alexis
Doctorant en informatique
Inscription : juin 2009
Messages : 428
Détails du profil
Informations personnelles :
Nom : Alexis
Localisation : France

Informations professionnelles :
Activité : Doctorant en informatique

Informations forums :
Inscription : juin 2009
Messages : 428
Points : 700
Points : 700
Je ne comprends pas vraiment comment est structuré ton programme. S'agit-il d'un interpréteur python embarqué ?

Moi ce que je ferais (mais ce n'est certainement pas optimal) c'est créer une fonction qui prend l'adresse du pointeur sur ton instance et retourne l'objet "enveloppé". Après ça fait longtemps que je n'est pas utiliser SWIG, en cython c'est relativement aisé mais il faut écrire le code du "wrapper".

Quoi qu'il en soit, plus d'explications sur le contexte utile pour comprendre ton problème.
Alexis.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h24   #5
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Citation:
Envoyé par Alexis.M Voir le message
S'agit-il d'un interpréteur python embarqué ?
Oui. Je pensais l'avoir écrit, mais j'ai manifestement oublié cette information. J'embarque Python dans une application C++.

J'aimerais éviter de modifier le code généré par SWIG ou de me baser sur le code généré par une version en particulier, ce qui rendrait l'évolution du logiciel assez peu aisée. Si SWIG n'offre pas les fonctionnalités que je désire, je changerai de système. J'aimerais quand même éviter d'écrire tous les wrappers à la main.
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 10h38   #6
Alexis.M
Membre chevronné
 
Alexis
Doctorant en informatique
Inscription : juin 2009
Messages : 428
Détails du profil
Informations personnelles :
Nom : Alexis
Localisation : France

Informations professionnelles :
Activité : Doctorant en informatique

Informations forums :
Inscription : juin 2009
Messages : 428
Points : 700
Points : 700
Je ne suis pas assez compétent sur SWIG pour t'aider mais il me semble qu'il te sera nécessaire à un moment ou un autre de créer un structure qui contient de manière globale les données qui doivent être visible par python et créer un API qui permet d'accéder à ces données.

Pense à une application comme Blender ou OOo qui permet d'acceder à ses données internes sous forme d'une API. Si on veut créer un "binding" avec un autre langage il suffit d'implémenter l'API dans ce langage.
Alexis.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 12h23   #7
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Citation:
Envoyé par Alexis.M Voir le message
créer un API qui permet d'accéder à ces données.
C'est ce que fait SWIG à partir des fichiers d'interface que je lui donne.
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 13h44   #8
Alexis.M
Membre chevronné
 
Alexis
Doctorant en informatique
Inscription : juin 2009
Messages : 428
Détails du profil
Informations personnelles :
Nom : Alexis
Localisation : France

Informations professionnelles :
Activité : Doctorant en informatique

Informations forums :
Inscription : juin 2009
Messages : 428
Points : 700
Points : 700
Je me suis mal exprimé, ce que je veux dire c'est que le programme C++ doit être conçu pour exposer ses données internes (ici l'instance de la classe créée par le code C++) et proposer une API pour y accéder.

Une façon simpliste de le faire est en effet de créer une variable globale et une fonction qui permet d'y accéder.
Alexis.M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 11h04   #9
Blustuff
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
Je ne sais toujours pas si SWIG propose une solution. Je me suis tourné vers Python.Boost qui est bien plus orienté intégration de Python dans une application C++. La conversion d'un objet c++ vers le wrapper de sa classe est décrit sur la page du wiki Python consacré à Boost :

http://wiki.python.org/moin/boost.py...mbeddingPython
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h42.


 
 
 
 
Partenaires

Hébergement Web