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 - Récupérer un tableau d'entier d'une fonction C [Python 2.X]


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    octobre 2004
    Messages
    440
    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 : 440
    Points : 252
    Points
    252
    Par défaut Ctypes - Récupérer un tableau d'entier d'une fonction C
    Bonjour,

    J'appelle une fonction C qui renvoie un tableau d'entiers.
    Mais je n'arrive pas à récupérer le résultat côté Python.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long * MaFunctionC() {
    	long *result;
    	result[0] = 0;
    	result[1] = 10;
    	result[2] = 20;
    	result[3] = 30;
    	return result;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MaLib = ctypes.cdll.LoadLibrary('MaLib.so')
    MaLib.MaFunctionC.restype = ct.c_long
    resultat = MaLib.MaFunctionC()
    i = 0
    while i <= 3:
        print("i : ", i)
        print("resultat[i] : ", resultat[i])
        i += 1
    J'ai ce message d'erreur : TypeError: 'int' object has no attribute '__getitem__'

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 3 842
    Points : 6 022
    Points
    6 022
    Par défaut
    Salut,

    ct.c_long déclare un int Python et tu veux récupérer un tableau c.

    Fait un print(resultat) pour voir.

    C'est ton code c ? Parce que si il est simple, alors utilise CPython, pour de petits codes ça n'a rien de compliqué.

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    octobre 2004
    Messages
    440
    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 : 440
    Points : 252
    Points
    252
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Fait un print(resultat) pour voir.
    Ca renvoie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <SimulationController.LP_c_long_Array_4 object at 0x7f05bec85c20>
    Citation Envoyé par VinsS Voir le message
    C'est ton code c ? Parce que si il est simple, alors utilise CPython, pour de petits codes ça n'a rien de compliqué.
    Oui, mais je n'ai mis que le petit bout important ici.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 3 842
    Points : 6 022
    Points
    6 022
    Par défaut
    Mouais, les arrays demandent une autre déclaration: restype = ctypes.POINTER(ctypes.c_float)

    Il y a des chances que ceci corresponde à ton besoin:
    https://stackoverflow.com/questions/...tion-in-ctypes

  5. #5
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    octobre 2004
    Messages
    440
    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 : 440
    Points : 252
    Points
    252
    Par défaut
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaLib.MaFunctionC.restype = ct.ARRAY(ct.c_long, 4)
    mais ça me renvoie :

    resultat[0] : 140406211129088
    resultat[1] : 140406211447534
    resultat[2] : 0
    resultat[3] : 140406211450903

  6. #6
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    octobre 2004
    Messages
    440
    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 : 440
    Points : 252
    Points
    252
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Mouais, les arrays demandent une autre déclaration: restype = ctypes.POINTER(ctypes.c_float)
    Il y a des chances que ceci corresponde à ton besoin:
    https://stackoverflow.com/questions/...tion-in-ctypes
    Quand on trouve ce qu'il faut, ça va mieux...et pourtant, j'en ai fait des recherches...

    Au final, je fais :
    Côté C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long * MaFunctionC() {
    	static long result[4];
    	result[0] = 0;
    	result[1] = 1;
    	result[2] = 2;
    	result[3] = 3;
    	return result;
    }
    Côté Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MaLib = ctypes.cdll.LoadLibrary('MaLib.so')
    MaLib.MaFunctionC.restype = ct.POINTER(ct.c_long)
    resultat = MaLib.MaFunctionC()
    i = 0
    while i <= 3:
        print("i : ", i)
        print("resultat[i] : ", resultat[i])
        i += 1
    Et j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    resultat[0] : 0
    resultat[1] : 1
    resultat[2] : 2
    resultat[3] : 3

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/07/2014, 09h37
  2. Réponses: 6
    Dernier message: 16/08/2010, 12h12
  3. Récupérer le tableau de bytes d'une image
    Par Finality dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 27/03/2009, 23h44
  4. Retourner un tableau d'entier avec une fonction ?
    Par Seb33300 dans le forum C++
    Réponses: 10
    Dernier message: 05/04/2007, 17h25
  5. Réponses: 13
    Dernier message: 07/05/2006, 12h54

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