Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre chevronné
    Inscrit en
    juillet 2002
    Messages
    842
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 842
    Points : 707
    Points
    707

    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 ?

  2. #2
    Membre chevronné
    Profil pro Alexis
    Ingénieur de recherche en informatique
    Inscrit en
    juin 2009
    Messages
    435
    Détails du profil
    Informations personnelles :
    Nom : Alexis
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche en informatique

    Informations forums :
    Inscription : juin 2009
    Messages : 435
    Points : 705
    Points
    705

    Par défaut

    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.

  3. #3
    Membre chevronné
    Inscrit en
    juillet 2002
    Messages
    842
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 842
    Points : 707
    Points
    707

    Par défaut

    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)

  4. #4
    Membre chevronné
    Profil pro Alexis
    Ingénieur de recherche en informatique
    Inscrit en
    juin 2009
    Messages
    435
    Détails du profil
    Informations personnelles :
    Nom : Alexis
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche en informatique

    Informations forums :
    Inscription : juin 2009
    Messages : 435
    Points : 705
    Points
    705

    Par défaut

    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.

  5. #5
    Membre chevronné
    Inscrit en
    juillet 2002
    Messages
    842
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 842
    Points : 707
    Points
    707

    Par défaut

    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.

  6. #6
    Membre chevronné
    Profil pro Alexis
    Ingénieur de recherche en informatique
    Inscrit en
    juin 2009
    Messages
    435
    Détails du profil
    Informations personnelles :
    Nom : Alexis
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche en informatique

    Informations forums :
    Inscription : juin 2009
    Messages : 435
    Points : 705
    Points
    705

    Par défaut

    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.

  7. #7
    Membre chevronné
    Inscrit en
    juillet 2002
    Messages
    842
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 842
    Points : 707
    Points
    707

    Par défaut

    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.

  8. #8
    Membre chevronné
    Profil pro Alexis
    Ingénieur de recherche en informatique
    Inscrit en
    juin 2009
    Messages
    435
    Détails du profil
    Informations personnelles :
    Nom : Alexis
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche en informatique

    Informations forums :
    Inscription : juin 2009
    Messages : 435
    Points : 705
    Points
    705

    Par défaut

    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.

  9. #9
    Membre chevronné
    Inscrit en
    juillet 2002
    Messages
    842
    Détails du profil
    Informations forums :
    Inscription : juillet 2002
    Messages : 842
    Points : 707
    Points
    707

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •