Python ctypes: chargement DLL à partir d'un chemin relatif

j'ai un module Python,wrapper.py, qui enveloppe un C DLL. La DLL se trouve dans le même dossier que le module. Donc, j'utilise le code suivant pour le charger:

myDll = ctypes.CDLL("MyCDLL.dll")

cela fonctionne si j'exécute wrapper.py à partir de son propre dossier. Si, cependant, je lance d'ailleurs, il échoue. C'est parce que ctypes calcule le chemin relatif au répertoire de travail courant.

ma question Est, y a-t-il un moyen par lequel je peux spécifier le chemin de la DLL par rapport à l'enveloppe au lieu de répertoire de travail actuel? Qui me permettra d'expédier les deux ensemble et de permettre à l'utilisateur d'exécuter d'importation/l'emballage de n'importe où.

22
demandé sur Frederick The Fool 2010-06-05 17:16:00

3 réponses

Vous pouvez utiliser os.path.dirname(__file__) pour obtenir le répertoire où se trouve le fichier source de Python.

24
répondu Matthew Flaschen 2010-06-05 13:21:45

développer la réponse de Matthieu:

import os.path
dll_name = "MyCDLL.dll"
dllabspath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + dll_name
myDll = ctypes.CDLL(dllabspath)

cela ne fonctionnera qu'à partir d'un script, pas de la console ni de py2exe.

12
répondu fmark 2010-06-05 13:30:24

j'ajoute toujours le répertoire où ma DLL est au chemin. Qui fonctionne:

os.environ['PATH'] = os.path.dirname(__file__) + ';' + os.environ['PATH']
windll.LoadLibrary('mydll.dll')

Notez que si vous utilisez py2exe, cela ne fonctionne pas (car __file__ n'est pas défini). Dans ce cas, vous devez compter sur le sys.executable attribut (instructions complètes à http://www.py2exe.org/index.cgi/WhereAmI)

6
répondu Chris B. 2010-06-05 13:27:56