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 : "ValueError: paramflags must have the same length as argtypes" [Python 3.X]


Sujet :

Python

  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut Appel d'une DLL : "ValueError: paramflags must have the same length as argtypes"
    bonjour,

    j'essaye de piloter un microcontrôleur FTDI UM245R avec des fonctions Python. J'ai suivi la documentation :
    https://docs.python.org/3/library/ctypes.html et le lien :
    http://stackoverflow.com/questions/2...le-from-python
    Code Python : 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
    import ctypes
    import ctypes.wintypes as wTypes
     
    # chargement de la DLL
    ftdiDLL = ctypes.WinDLL("C:\\Windows\\System32\\ftd2xx.dll")
     
    # ouverture du port
    protoFuncOpen = ctypes.WINFUNCTYPE(ctypes.c_uint32, ctypes.c_int, ctypes.c_void_p)
    paramFuncOpen = (1, "iDevice", 0),(1, "ftHandle", 0)
     
    funcOpen = protoFuncOpen(("FT_Open",ftdiDLL), paramFuncOpen)
    iDevice = ctypes.c_int(0)
    ftHandle = wTypes.DWORD(0)
    print(funcOpen(iDevice, ctypes.byref(ftHandle)))
    print(iDevice, ftHandle)
     
    # fermeture du port
    protoFuncClose = ctypes.WINFUNCTYPE(ctypes.c_uint32, wTypes.DWORD)
    paramFuncClose = (1, "ftHandle",0)
     
    funcClose = protoFuncClose(("FT_Close",ftdiDLL), paramFuncClose)
    print(funcClose(ftHandle))

    La documentation des fonctions FT_Open et FT_Close indiquent :

    FT_HANDLE DWORD
    FT_STATUS (DWORD)

    FT_STATUS FT_Open (int iDevice, FT_HANDLE *ftHandle)
    FT_STATUS FT_Close (FT_HANDLE ftHandle)
    Le type DWORD de Windows correspond au type uint32 de Python.

    Pour l'appel à la fonction FT_Open, je n'ai pas de souci. Par contre, pour FT_Close j'ai l'erreur suivante :
    funcClose = protoFuncClose(("FT_Close",ftdiDLL), paramFuncClose)
    ValueError: paramflags must have the same length as argtypes
    Où est mon erreur ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Auteur Voir le message
    Où est mon erreur ?
    Le message d'erreur est pourtant clair
    Concentrez vous sur la ligne 19, cet objet devrait être un tuple de tuples or il n'est que tuple.
    Raconté autrement, si j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a = (1, 2, 3)
    >>> len(a)
    3
    mais je ne veux pas un tuple à 3 éléments mais un tuple contenant des tuples à 3 éléments.
    Ce qui s'écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = (1, 2, 3),
    >>> len(a)
    1
    >>>
    Et maintenant, la condition len(paramflags) == len(argtypes) est vraie.

    Vous pouvez aussi relire la documentation de ctypes concernant paramflags:
    paramflags must be a tuple of the same length as argtypes.

    Each item in this tuple contains further information about a parameter, it must be a tuple containing one, two, or three items.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Concentrez vous sur la ligne 19, cet objet devrait être un tuple de tuples or il n'est que tuple.
    rhaaaaa la virgule oubliée. En lisant le commentaire j'ai compris tout de suite. Le genre d'erreur que l'on a sous les yeux sans la voir

    Merci wiztricks

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

Discussions similaires

  1. Appel d'une DLL dans une servlet
    Par blan dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 21/02/2007, 18h35
  2. Erreur lors de l'appel d'une DLL créée avec Visual
    Par WELCOMSMAIL dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/09/2006, 15h53
  3. PB appel d'une DLL
    Par maveric dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 10/08/2006, 19h17
  4. Appel d'une Dll dans le dossier courant.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/07/2006, 21h00
  5. Appel d'une dll (c++) dans un programme c++
    Par cout dans le forum C++
    Réponses: 2
    Dernier message: 01/06/2006, 14h52

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