2011-10-24 18 views
106

Estoy instalando Python 2.7 en CentOS 5. He construido e instalado Python de la siguiente maneraPython ejecutable no encontrar libpython biblioteca compartida

./configure --enable-shared --prefix=/usr/local 
make 
make install 

Cuando trato de ejecutar/usr/local/bin/python, consigo este mensaje de error

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory 

Cuando corro en LDD///bin/python locales usr, consigo

ldd /usr/local/bin/python 
    libpython2.7.so.1.0 => not found 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000) 
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000) 
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000) 
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000) 
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000) 

¿Cómo decirle a Python dónde encontrar libpython?

Respuesta

166

intente lo siguiente:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python 

Reemplazar /usr/local/lib con la carpeta en la que haya instalado libpython2.7.so.1.0 si no está en /usr/local/lib.

Si esto funciona y desea hacer permanentes los cambios, tiene dos opciones:

  1. Añadir export LD_LIBRARY_PATH=/usr/local/lib a su .profile en su directorio personal (esto sólo funciona si está utilizando una concha que carga este archivo cuando se inicia una nueva instancia de shell). Esta configuración afectará solo a su usuario.

  2. Agregue /usr/local/lib a /etc/ld.so.conf y ejecute ldconfig. Esta es una configuración de todo el sistema, por supuesto.

+0

¿Hay una manera de exportarlo para que funcione con el eclipse? Lo he agregado a mi .profile pero luego Eclipse no puede ejecutar gdb. (Nota: Agregarlo a ld.so.conf funciona sin embargo) – Setheron

+0

así que revisé las variables de entorno con las que se está ejecutando eclipse y tiene la LD_LIBRARY_PATH correcta. ¡Creo que cuando lanza GDB no usa ningún shell y por lo tanto no obtiene ninguna variable de entorno! Establecer el libpython en la configuración de depuración no ayudó tampoco, ya que eso es solo para cuando gdb realmente se carga (pero necesito cargar la lib para gdb) – Setheron

+1

¿Se puede depurar la aplicación con éxito cuando ejecuta 'gdb' desde la línea de comando? y LD_LIBRARY_PATH está configurado correctamente en la terminal? De lo contrario, probablemente tendrá que configurar LD_LIBRARY_PATH en su archivo '.gdbinit'. Consulte esta respuesta para obtener más información: http://stackoverflow.com/a/7041845/156771 –

14

que tenían el mismo problema y lo resolvió de esta manera:

Si sabe dónde libpython reside en, supuse que sería /usr/local/lib/libpython2.7.so.1.0 en su caso, sólo se puede crear un enlace simbólico :

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0 

intente ejecutar ldd de nuevo y ver si funcionaba.

+5

funcionó para mí después de hacer un 'ldconfig' –

-1

simplemente instale python-lib. (python27-lib). Instalará libpython2.7.so1.0. No es necesario configurar manualmente nada.

+3

//, Y si está encendido, digamos, CEntOS 6.3? Esto no funciona, allí, y normalmente la gente está compilando Python para lidiar con un caso en el que el sistema Python es una versión extraña, quebrada, poco confiable o que no desea tocar el sistema en general. –

0

He instalado con el comando:

./configure --prefix=/usr  \ 
      --enable-shared  \ 
      --with-system-expat \ 
      --with-system-ffi \ 
      --enable-unicode=ucs4 && 

make 

Ahora, como usuario root:

make install && 
chmod -v 755 /usr/lib/libpython2.7.so.1.0 

Luego trató de ejecutar Python y tiene el error:

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

Entonces , Me desconecté del usuario root y nuevamente intenté ejecutar Python y funcionó correctamente.

55

El poner en mi sombrero enterrador ...

La mejor manera que he encontrado para hacer frente a esto es en tiempo de compilación. Dado que usted es el prefijo de configuración de todos modos, también podría decirle al ejecutable explícitamente dónde encontrar sus bibliotecas compartidas.A diferencia de OpenSSL y otros paquetes de software, Python no le da directivas de configure interesantes que manejan caminos biblioteca alternativa (no todo el mundo es la raíz sabes ...) En el caso más simple de todo lo que necesita es la siguiente:

./configure --enable-shared \ 
      --prefix=/usr/local \ 
      LDFLAGS="-Wl,--rpath=/usr/local/lib" 

o si lo prefiere la versión no-Linux:

./configure --enable-shared \ 
      --prefix=/usr/local \ 
      LDFLAGS="-R/usr/local/lib" 

el "rpath" bandera le dice a Python que tiene bibliotecas de ejecución que necesita en ese camino particular. Puede llevar esta idea más lejos para manejar las dependencias instaladas en una ubicación diferente a las ubicaciones de sistema estándar. Por ejemplo, en mis sistemas ya que no tiene acceso de root y necesita hacer casi completamente autónomo Python se instala, mi línea de configuración es el siguiente:

./configure --enable-shared \ 
      --with-system-ffi \ 
      --with-system-expat \ 
      --enable-unicode=ucs4 \ 
      --prefix=/apps/python-${PYTHON_VERSION} \ 
      LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \ 
      CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include" 

En este caso soy compilar las librerías que Python utiliza (como ffi, readline, etc.) en un directorio extlib dentro del propio árbol de directorios de python. De esta forma puedo atacar el directorio python - $ {PYTHON_VERSION} y aterrizarlo en cualquier lugar, y "funcionará" (siempre que no se encuentre con los conflictos libc o libm). Esto también ayuda cuando intenta ejecutar múltiples versiones de Python en el mismo cuadro, ya que no necesita seguir cambiando su LD_LIBRARY_PATH o preocuparse por elegir la versión incorrecta de la biblioteca de Python.

Editar: Se olvidó de mencionar, la compilación se quejará si no se establece la variable de entorno para PYTHONPATH lo utiliza como su prefijo y no puede compilar algunos módulos, por ejemplo, para extender el ejemplo de arriba, ponga la PYTHONPATH al prefijo utilizado en el ejemplo anterior con export PYTHONPATH=/apps/python-${PYTHON_VERSION} ...

+0

Esto me ahorró mucho tiempo, ¡gracias! – digz6666

+0

//, Esto se parece a lo que estoy buscando. ¿Dónde puedo encontrar más información sobre cómo "atacar el directorio python-version y aterrizarlo en cualquier lugar y" funcionará "(siempre que no se encuentre con conflictos libc o libm)" _? ¿Crees que vale la pena hacer una pregunta separada de stackoverflow.com sobre esto? –

+0

//, Además, ¿cómo se debe establecer '$ PYTHON_VERSION'? –

0

Instalé Python 3.5 por Software Collections en CentOS 7 mínimo. Todo funcionó bien por su propia cuenta, pero vi el error biblioteca compartida mencionada en esta pregunta cuando intenté ejecutar un sencillo script CGI:

tail /var/log/httpd/error_log 
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory 

que quería una solución permanente de todo el sistema que funcione para todos los usuarios, por lo que excluye agregando declaraciones de exportación a los archivos .profile o .bashrc. Vi la solución here y luego me di cuenta de que también se menciona en una de las respuestas aquí. De todos modos, en CentOS 7, estos son los pasos:

vim /etc/ld.so.conf 

Qué en mi máquina acaba de tener:

Así que he creado un nuevo archivo:

vim /etc/ld.so.conf.d/rh-python35.conf 

y ha añadido:

/opt/rh/rh-python35/root/usr/lib64/ 

Después de un reinicio, el siguiente ing paso no era necesario, pero para reconstruir manualmente la caché:

sudo ldconfig 

Eso es todo, los scripts funcionan bien!

Esta era una solución temporal, que no funcionaba en los reinicios: opción

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v 

El -v (detallado) era sólo para ver lo que estaba pasando. Vi que sí: /opt/rh/rh-python35/root/usr/lib64: libpython3.so.rh-python35 -> libpython3.so.rh-python35 libpython3.5m.so.rh-python35- 1.0 -> libpython3.5m.so.rh-python35-1.0

Este error en particular desapareció. A propósito, tuve que chmod el usuario a apache para deshacerse de un error de permiso después de eso.

Tenga en cuenta que utilicé busque para buscar el directorio de la biblioteca. También puede hacer:

sudo yum install mlocate 
sudo updatedb 
locate libpython3.5m.so.rh-python35-1.0 

Qué en mi VM devuelve:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0 

¿Cuál es el camino que necesito para dar a ldconfig, como se muestra arriba.

+0

Puede haberse ahorrado algunos problemas yendo a/etc/profile. d y creando un archivo con lo siguiente en él: '#!/bin/bash' y' source scl_source enable rh-python35' en él. https://access.redhat.com/solutions/527703 – Doug

+0

@Doug que debería ser una respuesta! Lo intenté en otra máquina, mucho mejor enfoque. – Nagev

0

Esto funcionó para mí ...

$ sudo apt-get install python2.7-dev 
Cuestiones relacionadas