2010-09-29 4 views
3

Je veux utiliser les ctypes de python (2.6.5) avec cygwin, mais je ne sais pas comment charger une DLL.en utilisant python.ctypes avec cygwin

J'ai essayé différentes variantes comme

>>> form ctypes import * 
>>> cdll.LoadLibrary("/lib/libcairo.dll.a") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: Permission denied 
+1

Essayez de changer le permissons sur la dll (avec 'sudo chmod') ... – ChristopheD

+0

permissons sont corrects – Florianx

Répondre

2

Vous ne serez pas en mesure de charger une bibliothèque d'importation avec le module Python ctypes; il doit être une DLL réelle. J'ai utilisé à la fois la bibliothèque cygwin crypt et la bibliothèque d'importation crypt DLL comme exemples avec un modèle Cygwin en retard sur Win7.


Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01) 
[GCC 4.3.4 20090804 (release) 1] on cygwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> cdll.LoadLibrary('cygcrypt-0.dll') 
<CDLL 'cygcrypt-0.dll', handle 380000 at 7ef4564c> 
>>> 
>>> 
>>> cdll.LoadLibrary('libcrypt.dll.a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: Permission denied 
+1

thx, je ne savais pas comment les choses gère Cygwin dll. Y at-il une fonction magique, qui trouve les bibliothèques correctes sur toute la plate-forme juste par le nom, par ex. "crypte"? – Florianx

+0

Vous êtes les bienvenus. Je ne sais pas s'il existe un moyen multi-plateformes pour spécifier une bibliothèque dynamique lors de l'exécution. J'ai eu un problème similaire avec le Parrot VM et SQLite il y a un certain temps. Sous Linux, la bibliothèque partagée était libsqlite3.so, mais sous Windows, elle était sqlite3.dll. Bien que l'extension de fichier n'ait pas besoin d'être spécifiée dans Parrot, le nom de fichier différait toujours par "lib", mon programme avait donc toujours besoin d'instructions conditionnelles pour vérifier le type de système d'exploitation afin de charger la bibliothèque partagée. Linux atténue quelque peu la gestion de la bibliothèque partagée grâce à l'utilisation de liens symboliques. – JTP