IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

ctypes, callback fonction et valeur de retour [Python 2.X]


Sujet :

Interfaçage autre langage Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 480
    Par défaut ctypes, callback fonction et valeur de retour
    J'utilise à partir de Python une librairie compilé à partir de code C.
    J'appelle des fonctions de la librairie et je voudrais récupérer le résultat dans python.

    Voici le code python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Lib = ct.cdll.LoadLibrary('librairie.so')
    CMPFUNC2 = ct.CFUNCTYPE(None,ct.c_char_p)
    setCallBack = CMPFUNC2(setResult)
    Lib.start(setCallBack)
     
    def setResult(self, Name):
        bestName = Name.decode()
        return bestName
    et la librairie C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void start(void (*setResultToTheGUI)(char*))
    {
    ...
    setResultToTheGUI(bestNameToTheGUI);
    ...
    }
    Je voudrais donc récupérer bestName côté python.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par senacle Voir le message
    Je voudrais donc récupérer bestName côté python.
    Si votre fonction Python "setResult" est appelée, vous récupérez déjà "bestName" côté Python non?
    Pourquoi déclarer 2 paramètres alors que la fonction n'est appelée qu'avec un seul.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 480
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pourquoi déclarer 2 paramètres alors que la fonction n'est appelée qu'avec un seul.
    Je n'ai pas mis le code en entier.
    Le premier paramètre "self", c'est parce qu'on est dans une classe.

  4. #4
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 480
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si votre fonction Python "setResult" est appelée, vous récupérez déjà "bestName" côté Python non?
    C'est bien ce que je croyais...

    Lib.start prend en paramètre la fonction setCallBack, qui "représente" "setResult".

    Et la valeur attendue par "setResult" provient de Lib.start, via setResultToTheGUI(bestNameToTheGUI).

    C'est bien ça ? Pas sûr d'avoir tout compris...

    Si je fais côté Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lib.start(setCallBack('toto'))
    j'ai
    Ca, c'est normal.

    Mais ce que je veux, c'est la valeur qui est renvoyée par calculée dans la fonction start de la librairie C.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par senacle Voir le message
    Mais ce que je veux, c'est la valeur qui est renvoyée par calculée dans la fonction start de la librairie C.
    Et bien, commencez par respecter les interfaces et poster des informations plus claires!!! Car si j'essaie de vous suivre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> def setResult(self, Name):
    ...     bestName = Name.decode()
    ...     return bestName
    ...
    >>> setResult('toto')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: setResult() missing 1 required positional argument: 'Name'
    >>>
    Donc Lib.start(setCallBack('toto')) fait autre chose que ce que vous présentez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 480
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> def setResult(self, Name):
    ...     bestName = Name.decode()
    ...     return bestName
    ...
    >>> setResult('toto')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: setResult() missing 1 required positional argument: 'Name'
    >>>
    Pour essayer de reproduire comme vous le faites, vous pouvez retirer le premier paramètre self.

  7. #7
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 480
    Par défaut
    Je poste à nouveau le code avec quelques modifications pour essayer de clarifier.

    Voici le code python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Lib = ct.cdll.LoadLibrary('librairie.so')
    CMPFUNC2 = ct.CFUNCTYPE(None,ct.c_char_p)
    setCallBack = CMPFUNC2(setResult)
    Lib.start(setCallBack)
     
    def setResult(Name):
        bestName = Name.decode()
        return bestName
    et la librairie C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void start(void (*setResultToTheGUI)(char*))
    {
    ...
    bestNameToTheGUI = 'valeur_de_renvoi';
    setResultToTheGUI(bestNameToTheGUI);
    ...
    }
    Je voudrais donc récupérer bestNameToTheGUI côté python, c'est-à-dire : valeur_de_renvoi

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

Discussions similaires

  1. fonction avec valeur de retour
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 03/07/2009, 10h51
  2. [Tableaux] fonction et valeur de retour : mal codée ?
    Par Dsphinx dans le forum Langage
    Réponses: 6
    Dernier message: 22/06/2007, 14h12
  3. valeur de retour de la fonction "system" en C
    Par benhoeil dans le forum C
    Réponses: 14
    Dernier message: 16/09/2005, 11h30
  4. fonction operator, valeur de retour
    Par butch dans le forum C++
    Réponses: 21
    Dernier message: 20/09/2004, 10h30
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo