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 :

fonction d'interfaçage avec liste comme argument


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut fonction d'interfaçage avec liste comme argument
    Bonjour,

    je souhaiterais que ma fonction C reçoive une liste Python en argument lors de sont appelle.

    Le problème c'est que la taille de cette liste est variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PyArg_ParseTuple( args, "(s)", &liste_de_mots  ) //Liste de un mot 
    PyArg_ParseTuple( args, "(ss)", &liste_de_mots  ) //Liste de deux mots
    Quelle chaine de formatage dois-je utiliser S.V.P ?

    Merci d'avance.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PyObject *list;
    if(! (PyArg_ParseTuple(args, "o", &list) ) {
       return -1; // impossible de parser les arguments
    }
    if(! PyList_Check(list)) {
       return -2; // n'est pas une liste python ou un sous-type de liste python
    }

  3. #3
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour,
    merci pour ta réponse mais elle me renvoie une erreur de segmentation...

    Pour le moment j'utilise ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        PyObject * liste_de_mots ;
        if( !PyArg_UnpackTuple( args, "create_tree", 1, 1, &liste_de_mots  ) )
            return NULL;
    j'espère qu'il existe la même fonction pour transmettre à python des dico de taille variable.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Tu as un debugger pour le segfault ? (gdb pour ne pas le citer).

    Après pour faire une fonction C qui prend en argument une liste python, le prototype est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void myfunction(PyObject *list);
    Une liste python est de type PyObject * comme tout objet python. Un dictionnaire python est aussi de type PyObject *, une instance de classe PyObject * .

  5. #5
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Une liste python est de type PyObject * comme tout objet python. Un dictionnaire python est aussi de type PyObject *, une instance de classe PyObject * .
    Merci beaucoup pour cette explication.

    j'ai trouvé pas mal de renseignements ici

    J'ai remarqué que la plupart des fonctions de l'api python prenait en argument un PyObject *.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int PyString_Size (PyObject *string)
    J'imagine alors qu'un PyStringObject est un PyObject avec une variable définit à
    String à l'intérieur.

    Pour le retour de ma fonction en C, j'ai le même problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return Py_BuildValue( "{ss}", key, value ) ;
    J'ai tester ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return Py_BuildValue( "o", mon_dico ) ;
    Mais j'ai cette erreur à l'appel de ma fonction :
    SystemError: bad format char passed to Py_BuildValue
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  6. #6
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Désolé


    Py_BuildValue( "o", mon_dico ) ;

    Je viens de voir qu'il faut un O majuscule.

    Maintenant, ça me renvoie une erreur de segmentation.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Commence plutôt par une doc à jour pour partir sur une base saine

    http://docs.python.org/c-api/index.html

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Tu peux expliquer le contexte et mettre un bout de code C ?
    Est-ce que tu veux intégrer du C dans du python ou l'inverse ?
    ... etc

  9. #9
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    En fait, j'ai une application en python dans laquelle une fonction lourde est souvent appelée. Je veux réécrire cette fonction en C pour gagner en performance.

    merci pour la mise à jour . Je pensait que ma doc été d'actualité.

    Par contre je me pose une question...
    Si dans mes traitements j'avais une liste de string. Il faut mieux que j'utilise un PyListObject avec des PyStringObject ou un tableau de pointeur sur des tableau de caractère.

    Autrement dit dois je utiliser des objet C ou des objet C de l'entête python.h ?
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  10. #10
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    C'est bon j'ai réussi
    pour le dico qui doit être créé puis retourné, j'ai fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PyObject * tree ;
    tree = PyDict_New() ;
     
    PyDict_SetItem( tree, PyString_FromString( tmp ), PyString_FromString( mot_a_inserer + index ) ) ;
     
    return Py_BuildValue( "O", tree ) ;
    Avant j'avais ceci mais ça ne marchait pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PyDictObject tree ;
     
    PyDict_SetItem( (PyObject*) &tree, PyString_FromString( tmp ), PyString_FromString( mot_a_inserer + index ) ) ;
     
    return Py_BuildValue( "O",  &tree) ;
    Il me reste encore pas mal de choses à coder mais j'ai déjà un bon prototype et je pense que le plus dur est derrière moi.

    pour tout Tamiel.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

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

Discussions similaires

  1. Fonction de calcul avec liste déroulante
    Par hotmos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2014, 14h16
  2. Macro Word depuis Excel avec tableau comme argument
    Par emorejbleu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/07/2013, 14h45
  3. Réponses: 4
    Dernier message: 22/01/2013, 11h01
  4. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  5. [VBA] fonction qui reçoit une variable comme arguments
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/07/2007, 11h21

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