2017-06-09 1 views
1

Je suis le chargement d'un dll avec ctypes sous Cygwin avec les éléments suivants:Quel est le chemin de la DLL chargée?

import ctypes 
ctypes.cdll.LoadLibrary('foo.dll') 

Comment puis-je obtenir le chemin absolu de mon dll?

Le problème est que je n'ai absolument aucun indice où se trouve la DLL. Puis-je me référer à ce qui suit pour obtenir cette information?

subprocess.Popen(["which", lib], stdout=subprocess.PIPE).stdout.read().strip() 
+0

Est-ce que vous voulez obtenir le chemin absolu après le chargement de la DLL ou avant de le charger? – eryksun

+0

Bien sûr, après le chargement – nowox

+0

Cela devrait être facile, en supposant que Cygwin supporte 'dladdr' et que vous ayez un nom de fonction dans la bibliothèque. – eryksun

Répondre

2

Dans Unix, le chemin d'une bibliothèque partagée chargée peut être déterminée en appelant dladdr avec l'adresse d'un symbole dans la bibliothèque, par exemple en fonction.

Exemple:

import ctypes 
import ctypes.util 

libdl = ctypes.CDLL(ctypes.util.find_library('dl')) 

class Dl_info(ctypes.Structure): 
    _fields_ = (('dli_fname', ctypes.c_char_p), 
       ('dli_fbase', ctypes.c_void_p), 
       ('dli_sname', ctypes.c_char_p), 
       ('dli_saddr', ctypes.c_void_p)) 

libdl.dladdr.argtypes = (ctypes.c_void_p, ctypes.POINTER(Dl_info)) 

if __name__ == '__main__': 
    import sys 

    info = Dl_info() 
    result = libdl.dladdr(libdl.dladdr, ctypes.byref(info)) 

    if result and info.dli_fname: 
     libdl_path = info.dli_fname.decode(sys.getfilesystemencoding()) 
    else: 
     libdl_path = u'Not Found' 

    print(u'libdl path: %s' % libdl_path) 

Sortie:

libdl path: /lib/x86_64-linux-gnu/libdl.so.2 
+1

Je n'ai pas 'dladdr' disponible dans mon instance' ctypes.CDLL' – nowox

+0

Donc Cygwin ne supporte pas 'dladdr' (pas encore). Et ctypes ne supporte pas 'stdcall' dans Cygwin, non? Ainsi, nous ne pouvons pas charger kernel32.dll et appeler 'GetModuleFileNameW'. Si vous êtes dans un processus 64 bits, vous pouvez l'essayer avec 'CDLL' de toute façon, puisque Windows 64 bits a un seul ABI. Mais je n'ai pas installé Cygwin pour tester. – eryksun