Même si vous donnez un chemin complet CDLL ou cdll.LoadLibrary(), vous pouvez toujours besoin de mettre LD_LIBRARY_PATH avant d'appeler Python. Si la bibliothèque partagée que vous chargez fait explicitement référence à une autre bibliothèque partagée et qu'aucun "rpath" n'est défini dans le fichier .so pour cette bibliothèque, alors elle ne sera pas trouvée, même si elle a déjà été chargée. Un rpath dans une bibliothèque spécifie un chemin de recherche à utiliser pour rechercher les autres bibliothèques nécessaires à cette bibliothèque
Par exemple, j'ai un cas d'un ensemble de bibliothèques tierces interdépendantes que je n'ai pas produites. b.so références a.so. Même si je charge a.so à l'avance:
ctypes.cdll.LoadLibrary('/abs/path/to/a.so')
ctypes.cdll.LoadLibrary('/abs/path/to/b.so')
Je reçois une erreur sur la deuxième charge, car b.so se réfère simplement « a.so », sans rpath, et ainsi b.so n » Je sais que c'est le bon a.so. Donc, je dois définir LD_LIBRARY_PATH à l'avance pour inclure '/ abs/path/to'. Pour éviter d'avoir à définir LD_LIBRARY_PATH, vous modifiez l'entrée rpath dans les fichiers .so
Sous Linux, il y a deux utilitaires que j'ai trouvés: chrpath, et patchelf. chrpath est disponible depuis les dépôts Ubuntu. Il ne peut pas changer rpath sur .so qui n'en a jamais eu un. patchelf est plus flexible.
ceci diagnostique le problème mais ne le résout pas. – dbliss