2 votes

Python ctypes a échoué lors de l'importation d'un fichier dll

Je suis un novice en python et je rencontre actuellement un problème lors de l'importation d'un dll en python. En suivant quelques conseils trouvés en ligne, j'ai essayé d'utiliser ctypes comme ci-dessous avec un message d'erreur.

>>> import ctypes
>>> dl=ctypes.WinDll('C:\\Python27\\Lib\\site-packages\\UdfManagerPython.dll')

Traceback (most recent call last):
  File "", line 1, in 
    dl=ctypes.WinDll('C:\\Python27\\Lib\\site-packages\\UdfManagerPython.dll')
AttributeError: 'module' object has no attribute 'WinDll'

>>> dl=ctypes.cdll.LoadLibrary('C:\\Python27\\Lib\\site-packages\\UdfManagerPython.dll')

Traceback (most recent call last):
  File "", line 1, in 
    dl=ctypes.cdll.LoadLibrary('C:\\Python27\\Lib\\site-packages\\UdfManagerPython.dll')
  File "C:\Python27\lib\ctypes\__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "C:\Python27\lib\ctypes\__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] 

Est-ce que je fais quelque chose de mal ou ce dll n'a pas été compilé selon les normes python? Je l'ai téléchargé sur MediaFire pour votre analyse. Toute aide est grandement appréciée!

1voto

Luke Woodward Points 20417

J'ai chargé le DLL UdfManagerPython.dll dans Dependency Walker, et il a indiqué que ce DLL dépend de python22.dll. Lorsque j'ai essayé de charger ce DLL dans l'interpréteur Python (2.7), j'ai eu une boîte de dialogue qui m'a plus ou moins dit la même chose:

Le programme ne peut pas démarrer car python22.dll est manquant sur votre ordinateur. Essayez de réinstaller le programme pour résoudre ce problème.

Il semble donc que ce DLL devait être utilisé avec Python 2.2, et non pas avec Python 2.7 que vous utilisez.

Je n'ai pas Python 2.2 installé. Si vous l'avez, peut-être que vous obtenez des messages d'erreur différents des miens.

Il est également à noter que vous ne pouvez pas utiliser ctypes avec Python 2.2, car ctypes est pris en charge uniquement à partir de Python 2.3.

Je ne sais pas d'où vient ce DLL. J'ai recherché son nom sur Google et j'ai obtenu seulement quatre résultats, dont l'un était cette question.

Par ailleurs, j'ai vu une erreur de la forme 'Le module spécifié est introuvable' si le DLL lui-même peut être trouvé mais qu'une dépendance du DLL est manquante. Donc si vous obtenez un message comme celui-ci, et que vous êtes sûr que le DLL lui-même est présent, vérifiez ses dépendances.

EDIT: J'ai essayé d'installer Python 2.2 pour voir si je pouvais charger ce DLL. Avec Python 2.2 installé, vous pouvez au moins charger ce DLL, mais Python plante si vous essayez d'appeler l'une des méthodes init.... (Je ne sais pas quels paramètres leur passer, donc je ne leur en ai passé aucun.)

Voici ce qui s'est passé lorsque j'ai essayé d'appeler une de ces méthodes:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) \[MSC v.1500 32 bit (Intel)\] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import \*
>>> l = CDLL("UdfManagerPython.dll")
>>> l.initPyUdfNumber()
Fatal Python error: Interpreter not initialized (version mismatch?)

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

J'ai recherché la première ligne de ce message d'erreur, et le thème récurrent que j'ai obtenu de la plupart des résultats était que cette erreur indique que vous tentez de charger un module d'extension lié à une version de Python avec une autre version de Python.

Donc, en réponse à votre question dans les commentaires, non, je ne crois pas qu'il existe un moyen de charger ce DLL dans Python 2.7.

0voto

Christian Witts Points 4369

WinDll doit être tout en minuscules.

dl = ctypes.windll('C:\\Python27\\Lib\\site-packages\\UdfManagerPython.dll')

0voto

FogleBird Points 23405

Essayez WinDLL ou CDLL.

Je n'ai jamais utilisé LoadLibrary directement dans ctypes, mais il semble qu'il ne parvient toujours pas à trouver le DLL. Assurez-vous qu'il est dans votre chemin système. (Ou dans le même répertoire que votre module Python.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X