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

C Discussion :

Problème d'interface C/python


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Par défaut Problème d'interface C/python
    Bonjour à tous,

    Je suis en stage et je dois développer un "mini" logiciel qui avec 20 variables d'entrée me renvoie 4 réels. Pour des raisons pratiques, mon programme est en C mais j'utilise une interface python: je fais le lien entre les 2 langages avec le module distutils.core. Tout marche, jusqu'ici pas de problème. Voici le code simplifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    void MaFonction (double argument1, double argument2, ..., double argument20, double *sortie1, double *sortie2, double *sortie3, double *sortie4)
    {
    // Définition de tableaux utiles
    double tableau1[]={300, 200, 50, 20, 20}
    double tableau2[]={30, 10, 10, 5, 3}
     
    *sortie1=truc_compliqué1(argument1, ..., argument20, tableau1, tableau2)
    *sortie2=truc_compliqué2(argument1, ..., argument20, tableau1, tableau2)
    *sortie3=truc_compliqué3(argument1, ..., argument20, tableau1, tableau2)
    *sortie4=truc_compliqué4(argument1, ..., argument20, tableau1, tableau2)
    }
     
    // Lien avec le langage Python:
     
    static PyObject *MaFonction_python(PyObject *self, PyObject *args)
    {
    	double argument1, ..., argument20;
    	double sortie1, ..., sortie4
    	if (!PyArg_ParseTuple(args, "dddddddddddddddddddd", &argument1, ..., &argument20)
    	return NULL;
    	MaFonction(argument1, ..., argument20, &sortie1, ..., &sortie4);
    	return Py_BuildValue("dddd", sorte1, ..., sortie4);
    }
     
    static PyMethodDef mymodMethods[] = {
      {"MonModule", MaFonction_python, METH_VARARGS,"Calcul quelque chose"},
      {NULL, NULL, 0, NULL}
    };
     
    PyMODINIT_FUNC initMaFonction(void)
    {
      (void) Py_InitModule("MaFonction", mymodMethods);
    }
     
    int main(int argc, char *argv[])
    {
      Py_SetProgramName(argv[0]);
      Py_Initialize();
      initMaFonction();
      Py_Exit(0);
      return 0;
    }
    Après compilation une librairie .so est créée, je modifie donc sans problème la valeur des paramètres d'entrée (arguement1, etc.) et j’obtiens les sorties correspondantes.
    Là est mon problème: j'aimerai maintenant passer des tableaux en paramètres sous python (les même tableaux définis plus haut dans le code C: tableau1 et tableau2) au lieu de simples réels comme j'ai fait jusque là, mais je ne sais pas comment faire. Pouvez-vous m'aider? Merci!

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Salut !

    Je m'exerce à Python depuis quelques temps mais je n'ai pas encore tenté de faire l'interface, je ne savais pas que c'était possible dans ce sens, plutôt une bonne nouvelle

    Une première remarque sur ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MaFonction (double argument1, double argument2, ..., double argument20, double *sortie1, double *sortie2, double *sortie3, double *sortie4)
    Je te conseille vivement de faire une structure avec tes 20 variables d'entrées ou même un tableau. Pour les 4 valeurs de sortie, tu devrais aussi les mettre dans une structure et renvoyer cette structure.



    La suite m'est..... incompréhensible

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Eh bien moi je le savais, mais j'ai jamais trop callé le truc, bref peut-être un jour je capterais tout ça.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Une première remarque sur ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void MaFonction (double argument1, double argument2, ..., double argument20, double *sortie1, double *sortie2, double *sortie3, double *sortie4)
    Je te conseille vivement de faire une structure avec tes 20 variables d'entrées ou même un tableau. Pour les 4 valeurs de sortie, tu devrais aussi les mettre dans une structure et renvoyer cette structure.



    La suite m'est..... incompréhensible
    En fait c'est beaucoup plus compliqué que ça, j'ai 1500 lignes de code et je travail avec les variables séparément. En plus ca va être plus compliqué qu'autre chose de définir une structure ici parce que je ne sais pas comment indiquer cela dans le C. Bref I need your help!!!

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu t'y connais en C ou en Python ?

    Déclarer une structure en C n'est pas bien compliqué, tu peux regarder cette partie de la FAQ : http://c.developpez.com/faq/?page=struct_et_unions

    Ton problème est de passer un tableau C à une fonction Python ? C'est parcouru hier soir la même page que fred1599 a cité. J'ai vu qu'il existe des fonctions pour créer des listes et des tuples au format PyObject et même des fonctions génériques pour créer l'un ou l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PyObject *tuple, *list;
     
    tuple = Py_BuildValue("(iis)", 1, 2, "three");
    list = Py_BuildValue("[iis]", 1, 2, "three");
    Ce que je ne comprend pas dans ton code, c'est pour faire une fonction C que tu appelleras dans une fonction Python alors que cette fonction Python ne fait que renvoyer les paramètres sortie de la fonction C.

    Si ton problème est technique sur comment faire l'interface entre C et Python, il me parait plus simple pour toi (et aussi éventuellement pour ceux qui pourraient t'aider) de faire un bout de code exemple qui se charge juste de passer un tableau à une fonction Python, et non une version "simplifiée" de ton programme actuellement.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Ton problème est de passer un tableau C à une fonction Python ?
    Non en faite je dois passer un tableau du python vers le C: je le déclare en python et je travail avec en C.

    Citation Envoyé par Bktero Voir le message
    Ce que je ne comprend pas dans ton code, c'est pour faire une fonction C que tu appelleras dans une fonction Python alors que cette fonction Python ne fait que renvoyer les paramètres sortie de la fonction C.
    Oui en fait l'interface python, dans l'absolue, ne sert à rien pour le calcul. Je pourrais travailler uniquement en C. Le problème c'est que je dois absolument travailler en python (et donc faire le lien avec le code source en C avec l'interface) car j'utilise un autre logiciel derrière en python.

    Pour passer un réel du python vers le C, c'est assez simple le code est écrit plus haut. Mais pour passer un tableau du python vers le C là je ne connais pas la procédure...

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ton premier message n'était effectivement pas clair

    Tu cherches donc à convertir un tuple ou une liste Python en un tableau C ? En tapant "pyobject tuple to array" dans Google, l'un des premiers résultats te donnera peut-être un début de réponse : http://bytes.com/topic/python/answer...into-c-c-array

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu cherches donc à convertir un tuple ou une liste Python en un tableau C ? En tapant "pyobject tuple to array" dans Google, l'un des premiers résultats te donnera peut-être un début de réponse : http://bytes.com/topic/python/answer...into-c-c-array
    J'ai honte -_- j'avais pas cherché où il le fallait, merci beaucoup pour ton aide!

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Si ton problème est technique sur comment faire l'interface entre C et Python, il me parait plus simple pour toi (et aussi éventuellement pour ceux qui pourraient t'aider) de faire un bout de code exemple qui se charge juste de passer un tableau à une fonction Python, et non une version "simplifiée" de ton programme actuellement.
    +1, tout simplement c'est un problème complexe car nouveau pour nous, on veut bien t'aider, car ça nous intéresse aussi.

    ----------------------------------------------------------------------

    Je suppose que ton fichier script est au format pyx, j'en ai déjà fais mais juste en modifiant les variables python en variables C, pas plus loin.

    As-tu testé PyListObject, si oui comment?

    En tout cas, je trouve plus simple de travailler en python ou en C

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Par défaut
    Je n'ai pas utilisé PyListObject, je vais y jeter un oeil

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par heliantine Voir le message
    J'ai honte -_- j'avais pas cherché où il le fallait, merci beaucoup pour ton aide!
    Je pense que tu te posais mal le problème, simplement. De rien !

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

Discussions similaires

  1. Problème d'interface de base de données avec Frontpage
    Par Auxtown-Son dans le forum Outils
    Réponses: 3
    Dernier message: 11/07/2006, 16h42
  2. divers problèmes d'interface
    Par tourlourou dans le forum Delphi
    Réponses: 1
    Dernier message: 27/05/2006, 12h34
  3. Problème en interfacant C et Fortran
    Par karl3i dans le forum MFC
    Réponses: 6
    Dernier message: 23/05/2006, 16h10
  4. [VISUAL EDUTOR] Problème Affichage Interface
    Par mathieu77186 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/03/2006, 17h08
  5. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36

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