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 : 39
    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 appel.

    problème c'est que la tail de cette liste est variab.

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

    Merci d'avance.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter s 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éctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PyObject *list;
    if(! (PyArg_ParseTup(args, "o", &list) ) {
       return -1; // impossib de parser s 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 : 39
    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 el me renvoie une erreur de segmentation...

    Pour moment j'utilise ceci.
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        PyObject * liste_de_mots ;
        if( !PyArg_UnpackTup( 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 tail variab.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter s 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 segfault ? (gdb pour ne pas citer).

    Après pour faire une fonction C qui prend en argument une liste python, prototype est :
    Code : Séctionner 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 : 39
    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 *.

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

    Pour retour de ma fonction en C, j'ai même problème.
    Code : Séctionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return Py_BuildValue( "{ss}", key, value ) ;
    J'ai tester ceci :
    Code : Séctionner 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 s 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 : 39
    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 majuscu.

    Maintenant, ça me renvoie une erreur de segmentation.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter s 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 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 : 39
    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 laquel 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 tabau de pointeur sur des tabau 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 s 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 : 39
    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 dico qui doit être créé puis retourné, j'ai fait ceci

    Code : Séctionner 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éctionner 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 plus dur est derrière moi.

    pour tout Tamiel.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter s 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 tabau 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 variab 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