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

Python Discussion :

Appel d'une dll C depuis du code Python


Sujet :

Python

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Appel d'une dll C depuis du code Python
    Le problème est le suivant

    - Je dispose d'une dll existante ( à utiliser tel quelle)
    - J'utilise le module "ctypes" pour appeler des fonctions de cette dll.Cela se passe tres bien tant que les types des arguments sont des entiers, des caractères ou tableau d'entiers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lib.fonctionA.argtypes = [c_uint32,c_uint32]
    lib.fonctionA.restype = c_uint32
    ib.fonctionA(arg1, arg2)
    - Les difficultés surviennent lorsqu'une fonction X prend des arguments de types un peu plus complexes
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct {
      int Mac_Address[6]; 
      int IP_Address[4];
      int UDP_Port;
    } IS_Port_struct;
     
    typedef struct {
      IS_Port_struct Transmit; 
      IS_Port_struct Receive;
    } IS_Set_Ports_struct;
    Sur un conseil il ma été proposé de wrapper la structure complexe avec SWIG (extension pour interfacer le C et le Python), pour quelle puisse ensuite être passée en parametre

    - Le wrapping se passe bien, j'arrive à instancier des objects de cette structure
    - Le passage en arguments à la fonction X ne marche toujours pas

    J'obtiens les erreurs suiivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lib.fonctionXs.argtypes = [c_uint32,type(wrapped_struct)]
    -->"item 2 in _argtypes_ has no from_param method"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ib.fonctionXs(arg1, arg2)]
    -->"Don't know how to convert parameter 2"

    Voilà

    Question
    - Que faire pour pouvoir utiliser cette fonction?
    - La methode "ctypes" peut elle prendre un object de type swig?

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je te conseille plutôt de décrire ta structure avec ctypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IS_Port_struct(class ctyopes.Structure):
      __fileds = []

  3. #3
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Je te conseille plutôt de décrire ta structure avec ctypes
    idem

    Un petit exemple un peu plus complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from ctypes import *
     
    class IS_Port_struct(Structure):
      _fields_ = [
                 ("Mac_Address", c_int * 6),
                 ("IP_Address", c_int * 4),
                 ("UDP_Port", c_int),        
                 ]
     
    IS_Port_struct.UDP_Port = 4000
    print type(IS_Port_struct)
    print IS_Port_struct.Mac_Address
    print IS_Port_struct.UDP_Port

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je n'avais pas le temps d'écrire un exemple complet, merci à toi !

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos contributions,

    Il me semble avoir déjà essayer cette méthode, la définition de la stucture ne pose pas de problème, et les "print" également ne pose pas de soucis, car ce sont tous des objets pythons.

    Mais cette structure si elle est passée en argument à une dll, là ça coince, car l'interface n'est pas évidente.

    je vais quand même réessayer , il se peut que je l'ai mal codé.

    Merci

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par gnayoke Voir le message
    Merci pour vos contributions,

    Il me semble avoir déjà essayer cette méthode, la définition de la stucture ne pose pas de problème, et les "print" également ne pose pas de soucis, car ce sont tous des objets pythons.

    Mais cette structure si elle est passée en argument à une dll, là ça coince, car l'interface n'est pas évidente.

    je vais quand même réessayer , il se peut que je l'ai mal codé.

    Merci
    ??? L'interface n'est pas évidente ? Si tu passes la structure par ctypes, il n'y a aucun souci

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    ç a y est le problème est résolu, pourtant j'étais persuadé de l'avoir déjà essayé.

    Merci à tous

  8. #8
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Concretement aprés avoir créer la structure

    j'ai défini le type de ma structure et l'ai passé en argument dans la méthode argtype

    Ports_type = Port_Struct*2 /*Car j'utilise un tableau de 2 fois cette structure*/
    lib.fonctionX.argtypes = [c_uint32,Ports_type()]

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

Discussions similaires

  1. [JNI] appel d'une méthode java depuis le code natif
    Par myryad dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 19/05/2009, 11h23
  2. Appel d'une DLL C depuis VB
    Par oliver_mpt dans le forum Windows
    Réponses: 6
    Dernier message: 13/06/2008, 14h40
  3. Appel d'une méthode C++ depuis un code C
    Par fantomchris dans le forum MFC
    Réponses: 3
    Dernier message: 02/05/2008, 12h52
  4. [Compilation] Appel d'une fonction C++ depuis du code C
    Par bladerunners dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2006, 14h26

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