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 :

Utilisation de ctypes


Sujet :

Interfaçage autre langage Python

  1. #1
    Futur Membre du Club
    Utilisation de ctypes
    Bonjour,

    Après de longues recherches, j'ai pu constater que l'utilisation de fonctions C/C++ en Python grâce à ctypes a fait l'objet de multiples discussions. Pour autant, je ne trouve toujours pas la solution à mon problème.

    Je souhaite utiliser une bibliothèque C++ propriétaire au format dll (nommé exemple.dll pour l'exemple) dans un programme python. Mon code est le suivant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    from ctypes import *
    lib_c = cdll.LoadLibrary("D:\test\exemple")


    Un message d'erreur apparait à l'exécution :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "D:\Test\test.py", line 2, in <module>
        lib_c = cdll.LoadLibrary("D:\test\exemple")
      File "C:\Users\   ...    \Python36\lib\ctypes\__init__.py", line 426, in LoadLibrary
        return self._dlltype(name)
      File "C:\Users\   ...    \Python36\lib\ctypes\__init__.py", line 348, in __init__
        self._handle = _dlopen(self._name, mode)
    OSError: [WinError 126] Le module spécifié est introuvable


    A priori je n'ai pas d'erreur dans le chemin d'accès au fichier dll puisqu'en mettant le fichier msvcrt.dll dans ce dossier et en remplaçant "exemple" par "msvcrt" dans mon code je n'ai pas de message d'erreur.

    Auriez vous une solution à mon problème ?

  2. ###raw>post.musername###
    Modérateur
    Salut,

    Citation Envoyé par YannCER Voir le message
    Auriez vous une solution à mon problème ?
    Vous avez deux soucis potentiels:
    • le nom du fichier: "D:\test\exemple" le "\" est un caractère d’échappement. Si vous tapez çà à la console Python, çà retourne 'D:\test\\exemple' et ce fichier là n'existe pas. Doublez les "\" ou utilisez des raw-strings r"D:\test\exemple".
    • La DLL et Python sont tout eux 32 bits ou 64 bits: s'ils n'ont pas été compilés de façon cohérente, le fichier risque de ne pas être trouvé.



    - W
      0  0

  3. #3
    Futur Membre du Club
    Bonjour,

    Merci pour ce retour.

    Par rapport à vos deux propositions :
    - j'avais bien identifié ce problème potentiel lors de mes recherches et avais testé le doublement des "\" ou les raw-strings. Par acquit de conscience, j'ai retesté les deux syntaxes mais rien n'y fait, toujours le même problème.
    - la bibliothèque a été compilée en 64 bits. Le premier message d'erreur que j'avais reçu indiquait une incompatibilité entre 64 et 32 bits ; j'utilisais Python 32 bits. En passant à Python 64 bits ce message d'erreur a disparu, pour laisser place au message d'erreur qui m'a conduit à poster sur ce forum, module introuvable.

    Auriez vous d'autres solutions à proposer ? Faut il que j'oublie l'utilisation de ctypes et passe par un autre moyen ?

  4. #4
    Modérateur

    Citation Envoyé par YannCER Voir le message
    Auriez vous d'autres solutions à proposer ? Faut il que j'oublie l'utilisation de ctypes et passe par un autre moyen ?
    A priori, ctypes fonctionne...
    Donc c'est plutôt côté DLL qu'il y a des soucis.
    Soit son format n'est pas compatible avec ce que supporte ctypes (voir la documentation), soit il y a d'autres soucis.
    Essayez déjà de charger votre DLL depuis un programme C/C++, çà devrait vous donner quelques pistes.

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

  5. #5
    Futur Membre du Club
    Je reviens après un certain temps sans grande nouveauté.

    Je ne maitrise pas le C++. Une personne maitrisant le C++ utilise largement la libraire sans problème apparent.
    J'ai essayé sur d'autres DLL qui proviennent du même propriétaire mais peut être un peu plus anciennes. J'arrive à en importer certaines mais pas d'autres.

  6. #6
    Modérateur

    Citation Envoyé par YannCER Voir le message
    J'arrive à en importer certaines mais pas d'autres.
    Vous avez des utilitaires de développements (qui dépendent du système) genre DUMPBIN sous Windows qui devrait vous permettre de les inspecter et trouver les différences.

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

  7. #7
    Futur Membre du Club
    Bonjour,

    Après plusieurs mois, je me suis remis sur le sujet et EUREKA ! J'ai réussi à charger la librairie. La librairie que j'essayais en vain de charger faisait appel à une autre librairie. Cette librairie n'étant pas chargée auparavant et n'étant pas présente dans le dossier system32, python n'arrivait pas à la trouver et renvoyait une erreur. En chargeant préalablement cette deuxième librairie, le chargement de la première se passe sans problème.

    Merci pour le temps que vous avez accordé à ma demande.