Estoy intentando importar pycurl
:
$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory
Ahora libcurl.so.4
está adentro /usr/local/lib
. Como puede ver, esto está en sys.path
:
$ python -c "import sys; print(sys.path)"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg',
'/usr/local/lib/python25.zip', '/usr/local/lib/python2.5',
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk',
'/usr/local/lib/python2.5/lib-dynload',
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib',
'/usr/local/lib/python2.5/site-packages']
Cualquier ayuda será apreciada.
LD_LIBRARY_PATH
correctamente (pensé que a su comentario le faltaban dos puntos).Respuestas:
sys.path
solo se buscan módulos de Python. Para las bibliotecas vinculadas dinámicas, las rutas buscadas deben estar enLD_LIBRARY_PATH
. Compruebe siLD_LIBRARY_PATH
incluye/usr/local/lib
, y si no lo hace, agréguelo e intente nuevamente.Algo más de información ( fuente ):
Actualización: para configurar
LD_LIBRARY_PATH
, use uno de los siguientes, idealmente en su~/.bashrc
archivo o archivo equivalente:o
Use el primer formulario si está vacío (equivalente a la cadena vacía, o no está presente), y el segundo formulario si no lo está. Tenga en cuenta el uso de la exportación .
fuente
Asegúrese de que su módulo libcurl.so esté en la ruta de la biblioteca del sistema, que es distinta y separada de la ruta de la biblioteca de Python.
Una "solución rápida" es agregar esta ruta a una variable LD_LIBRARY_PATH. Sin embargo, configurar ese sistema en todo el sistema (o incluso en toda la cuenta) es una IDEA MALA, ya que es posible configurarlo de tal manera que algunos programas encuentren una biblioteca que no debería, o peor aún, abrir agujeros de seguridad.
Si sus "bibliotecas instaladas localmente" están instaladas en, por ejemplo, / usr / local / lib, agregue este directorio a /etc/ld.so.conf (es un archivo de texto) y ejecute "ldconfig"
El comando ejecutará una utilidad de almacenamiento en caché, pero también creará todos los "enlaces simbólicos" necesarios para que funcione el sistema del cargador. Es sorprendente que el "make install" para libcurl no lo haya hecho ya, pero es posible que no pueda si / usr / local / lib no está en /etc/ld.so.conf ya.
PD: es posible que su /etc/ld.so.conf no contenga más que "incluir ld.so.conf.d / *. Conf". Todavía puede agregar una ruta de directorio después, o simplemente crear un nuevo archivo dentro del directorio desde el que se está incluyendo. No olvide ejecutar "ldconfig" después de él.
Ten cuidado. Hacer esto mal puede arruinar su sistema.
Además: asegúrese de que su módulo Python esté compilado contra ESA versión de libcurl. Si acaba de copiar algunos archivos desde otro sistema, esto no siempre funcionará. En caso de duda, compile sus módulos en el sistema en el que desea ejecutarlos.
fuente
También puede configurar LD_RUN_PATH en / usr / local / lib en su entorno de usuario cuando compila pycurl en primer lugar. Esto incrustará / usr / local / lib en el atributo RPATH del módulo de extensión C para que sepa automáticamente dónde encontrar la biblioteca en tiempo de ejecución sin tener que tener LD_LIBRARY_PATH establecido en tiempo de ejecución.
fuente
python setup.py build_ext --rpath=/usr/local/lib
en la construcción del módulo de extensión para cocer al horno en el rpathTenía exactamente el mismo problema. Instalé curl 7.19 en / opt / curl / para asegurarme de que no afectaría a curl actual en nuestros servidores de producción. Una vez que vinculé libcurl.so.4 a / usr / lib:
sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4
¡Todavía tengo el mismo error! Durf.
Pero ejecutar ldconfig hizo el enlace para mí y funcionó. No es necesario configurar LD_RUN_PATH o LD_LIBRARY_PATH en absoluto. Solo necesitaba ejecutar ldconfig.
fuente
LD_LIBRARY_PATH
método de variable de entorno descrito anteriormente. Si no desea establecerlo en su~/.bashrc
(agregar esa configuración no es una buena idea IMO), puede escribir un script de shell que establezca esta variable y luego ejecute python, luego llame a ese script.Como suplemento a las respuestas anteriores, solo estoy tropezando con un problema similar y estoy trabajando completamente con el pitón instalado por defecto.
Cuando llamo al ejemplo de la biblioteca de objetos compartidos que estoy buscando
LD_LIBRARY_PATH
, obtengo algo como esto:Notablemente, ni siquiera se queja de la importación, ¡se queja del archivo fuente!
Pero si fuerzo la carga del objeto usando
LD_PRELOAD
:... Inmediatamente recibo un mensaje de error más significativo, ¡sobre una dependencia que falta!
Solo pensé en anotar esto aquí - ¡salud!
fuente
Yo uso
python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0
y el archivo compilado .so está debajo de la carpeta de compilación. puede escribirpython setup.py --help build_ext
para ver las explicaciones de -R y -Ifuente
Para mí, lo que funciona aquí es usar un administrador de versiones como pyenv , que recomiendo encarecidamente para que sus entornos de proyecto y versiones de paquetes estén bien administrados y separados del sistema operativo.
Tuve este mismo error después de una actualización del sistema operativo, pero se solucionó fácilmente con
pyenv install 3.7-dev
(la versión que uso).fuente