ejecutable crear python

crear ejecutable python linux



El ejecutable de Python no encuentra la biblioteca compartida de libpython (7)

Estoy instalando Python 2.7 en CentOS 5. Creé e instalé Python de la siguiente manera

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

Cuando intento ejecutar / usr / local / bin / python, recibo 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 ejecuto ldd en / usr / local / bin / python, obtengo

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 le digo a Python dónde encontrar libpython?


Esto funcionó para mí ...

$ sudo apt-get install python2.7-dev


Instalé Python 3.5 por colecciones de software en CentOS 7 mínimo. Todo funcionó bien por sí mismo, pero vi el error de la biblioteca compartida mencionado en esta pregunta cuando intenté ejecutar un simple 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

Quería una solución permanente para todo el sistema que funcionara para todos los usuarios, por lo que excluía la adición de 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

Lo que en mi máquina acaba de tener:

include ld.so.conf.d/*.conf

Así que creé un nuevo archivo:

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

Y agregado:

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

Después de reiniciar, el siguiente paso no era necesario, pero para reconstruir manualmente el caché:

sudo ldconfig

Eso es todo, ¡los guiones funcionan bien!

Esta fue una solución temporal, que no funcionó en reinicios:

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

La opción -v (verbosa) era solo para ver qué 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é find para ubicar el directorio de la biblioteca. También podrías hacer:

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

Que en mi VM devuelve:

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

¿Cuál es el camino que debo dar a ldconfig, como se muestra arriba?


Instalé usando 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 intenté ejecutar Python y obtuve el error:

/ usr / local / bin / python: error al cargar las bibliotecas compartidas: libpython2.7.so.1.0: no se puede abrir el archivo de objeto compartido: No existe dicho archivo o directorio

Luego, me desconecté del usuario root e intenté ejecutar Python nuevamente y funcionó correctamente.


Poniendo mi sombrero de sepulturero ...

La mejor manera que he encontrado para solucionar 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 buenas directivas de configuración para manejar rutas de biblioteca alternativas (no todos son root, usted sabe ...) En el caso más simple, todo lo que necesita es lo siguiente:

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

O si prefiere la versión que no es de Linux:

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

El rpath " rpath " le dice a python que tiene bibliotecas de tiempo de ejecución que necesita en esa ruta 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 tengo acceso de root y necesito hacer instalaciones de Python casi completamente autónomas, mi línea de configuración se ve así:

./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, estoy compilando las bibliotecas que usa python (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 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 establece la variable de entorno PYTHONPATH a lo que usa como prefijo y no compila algunos módulos, por ejemplo, para extender el ejemplo anterior, configure PYTHONPATH con el prefijo utilizado en el ejemplo anterior con la export PYTHONPATH=/apps/python-${PYTHON_VERSION} ...


Pruebe lo siguiente:

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

Reemplace /usr/local/lib con la carpeta donde ha instalado libpython2.7.so.1.0 si no está en /usr/local/lib .

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

  1. Agregue la export LD_LIBRARY_PATH=/usr/local/lib a su .profile en su directorio de inicio (esto funciona solo si está usando un shell 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.


Tuve el mismo problema y lo resolví de esta manera:

Si sabes dónde reside libpython, supongo que sería /usr/local/lib/libpython2.7.so.1.0 en tu caso, simplemente puedes crear un enlace simbólico al mismo:

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

Luego intente ejecutar ldd nuevamente y vea si funcionó.


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