Estoy tratando de obtener código de código abierto funcionando (el proyecto es here). Es una gran base de código C++ con un contenedor python (muy) delgado que usa CDLL
para cargar el C++ y llamar a algunas funciones C que están disponibles para permitir el desarrollo de scripts Python primitivos del código.python cargando c lib con CDLL, no ve bibliotecas en la ruta de Python
Sin embargo, el código inicial de importación se estrella porque no puede encontrar los archivos .so sentados junto a él en site-packages:
en el archivo instalado:
from ctypes import *
try:
self.lib = CDLL("_lammps.so")
except:
try:
self.lib = CDLL("_lammps_serial.so")
except:
raise OSError,"Could not load LAMMPS dynamic library"
y en un script o el intérprete:
from lammps import lammps
l = lammps()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lammps.py", line 42, in __init__
raise OSError,"Could not load LAMMPS dynamic library"
OSError: Could not load LAMMPS dynamic library
Otras respuestas might seem to have this covered, pero esto sólo funciona si CDLL()
se llama dentro de la escritura de hecho invocado (o el directorio de trabajo del aviso que ejecutó el intérprete), es decir, si la 'ruta relativa' está en espacio de usuario, en lugar de python-biblioteca-espacio.
¿Cómo instalamos con seguridad para importar una biblioteca C/C++ que construimos nosotros mismos? Sin contaminar las ubicaciones de la biblioteca del sistema como /usr/lib
, que no es muy pitónico, no veo una solución fácil.
(EDIT: corregido los nombres de función, refactorización claro inútil lo siento!)
más: la biblioteca en cuestión tenía un símbolo faltante, por lo que este código podría haber enmascarado un error diferente; ¡uno no debe asumir que usted sabe cuál es la excepción del sistema y arrojar la suya! De hecho, la pregunta sigue siendo válida luego de una investigación adicional; el sistema * estaba * arrojando el error correcto la primera vez (probé esto copiando .so a '/ usr/lib' y ejecutando' CDLL() 'desde el prompt interactivo.) – tehwalrus