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 :

import de dll


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut import de dll
    Salut à tous

    Je me heurte depuis quelques jours à un problème que je ne comprends pas. J'avais un code qui fonctionnait il y a 6 mois. Je n'y ai pas touché depuis et là il ne fonctionne plus. Il s'agit d'une erreur sur l'import d'une dll que mon code ne trouve plus. Sauf que la dll n'a pas bougé non plus ! ... Je regarde le sys.path, le dossier de la dll est bien dedans. Après, comme indiqué dans la doc de ctypes.cdll, ca peut être du à une autre dll, dont la dll surlaquelle je tire dépend. Ok, je recommences l'exercice avec une dll plus simple alors, sans dépendance. J'en ai trouvé une sur la toile :

    smalldll.dll

    (et en effet quand je la passe au dependency walker, il n'y a pas de dépendance). J'ouvre python directement dans mon shell pour ce nouveau test, comme ça en plus j'élimine les choses liées à l'IDE.

    Je place 'smalldll.dll', directement à la racine de E:// dans cet exemple. Et je travaille dans un dossier temp que je créée en dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import os,sys
    from ctypes import cdll
     
    os.chdir('E:\\temp')
    print(sys.getcwd()) ## Ok, je suis bien dans E://temp
    cdll.LoadLibrary('E://smalldll.dll')
    Sur ce code la dll est trouvée. J'ai une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OSError: [WinError 193] %1 n’est pas une application Win32 valide
    mais ok, la dll est trouvée donc.

    Si maintenant, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if 'E://' not in sys.path : sys.path.append('E://')
    cdll.LoadLibrary('smalldll.dll')
    Là je retombe sur l'erreur de dll introuvable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OSError: [WinError 126] Le module spécifié est introuvable
    Pourtant le répertoire dans lequel se trouve celle ci est bien dans mon python path ...

    Dans le cas d'une dll qui tire sur autre dll, je n'ai pas la main pour pouvoir lui donner le chemin absolu. Je dois donc parvenir à faire fonctionner ce 2ième test.

    L'un de vous a t il déjà rencontré un problème similaire ? Parvenez vous au même résultat que moi avec ce petit exemple de smalldll.dll ? Je suppute que ctypes.cdll a changé sa manière de faire, mais je ne trouve rien dans la doc concernant cela ...

    J'ai essayé avec mon install de anaconda python 3.7, et aussi après avec un python 3.10.2 que je viens d'installer pour l'occasion. Que ce soit 3.7 ou 3.10.2, j'obtiens les mêmes résultats (c-à-d, la dll est trouvée si je donne le chemin absolu, mais ne l'est pas si je donne juste son nom et que le répertoire dans lequel elle se trouve est dans le sys.path)

    Merci pour vos retours

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    cdll.LoadLibrary délègue au dlopen de l'environnement système.
    Et le search-path de ce dlopen n'a rien à voir avec sys.path (là où python cherche ses modules).
    => utiliser un nom de chemin absolu ou relatif.

    Après pourquoi smalldll.dll ne charge pas... la première hypothèse est que c'est une bibliothèque 32 bits que vous essayez de charger dans un process 64bits.

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

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    cdll.LoadLibrary délègue au dlopen de l'environnement système.
    Sous linux oui, mais sous windows, dlopen n'existe pas ... Et auparavant quand j'ajoutais au sys.path les chemins où se trouvait mes dll, le cdll.LoadLibrary les trouvait bien ! Donc c'est quand même étrange que ça fonctionnait si sur windows, le dll search path ne se base pas sur le sys.path (de manière direct ou indirecte peut être)...

    Citation Envoyé par wiztricks Voir le message
    Après pourquoi smalldll.dll ne charge pas... la première hypothèse est que c'est une bibliothèque 32 bits que vous essayez de charger dans un process 64bits.
    Oui ca c'est quasiment sûr que c'est ca. La smalldll c'est juste pour le test, mais ce n'est pas cette dll qui au final m'intéresse. Donc juste si python la trouve, mais qu'il n'arrive pas à la charger, alors je suis content et j'ai ce qu'il me faut pour être débloqué

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Sous linux oui, mais sous windows, dlopen n'existe pas ...
    Certes, c'est le boulot de LoadLibraryExW qui va les chercher avec sa logique.

    En lisant votre réponse, j'ai trouvé cette entrée dans la buglist Python qui explique tout çà (et donne un mode d'emploi pour Python 3.8+)

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

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Super, merci beaucoup wiz pour le lien ca m'a bien fait rebondir sur tout un tas de chose intéressante, qui m'ont débloqué.

    Alors du coup pour python >= 3.8, sur windows, il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.add_dll_directory('E://')
    et l'exemple donné ci dessus fonctionne.

    Pour python<3.8, il faut non pas passer par sys.path mais par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.environ['PATH']+=os.pathsep+'E://'
    Il s'avère que le module search path correspond à sys.path, mais que le DLL search path, lui est os.environ['PATH'] donc, jusqu'à la v3.7 de python.

    Pour Linux je ne sais pas comment ça marche (je regarderais, mais surement pas de tout de suite, il faut déjà que l'ensemble du code qu'on m'a remis fonctionne sous windows), mais ce qui est sûr c'est que la fonctionnalité os.add_dll_directory n'a été ajoutée que sur windows, donc le process sera encore certainement différent sous Linux.

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

Discussions similaires

  1. Comment importer une DLL dans du code???
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 29
    Dernier message: 19/04/2006, 19h19
  2. Importer une DLL
    Par Sallie dans le forum MFC
    Réponses: 8
    Dernier message: 14/04/2006, 10h47
  3. [NetBeans] importer une dll
    Par guitalca dans le forum NetBeans
    Réponses: 1
    Dernier message: 16/12/2005, 11h13
  4. [v6.0] Importer une DLL
    Par ni0urk dans le forum MFC
    Réponses: 19
    Dernier message: 17/11/2005, 16h19
  5. [FLASH MX2004] Importer une dll
    Par Fry dans le forum Flash
    Réponses: 4
    Dernier message: 07/01/2005, 10h54

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