¿PyInstaller no puede encontrar libpython2.7.so cuando crea un binario?

Estoy tratando de hacer una versión binaria de un script de Python usando PyInstaller 2.0 en Linux. Cuando corro

$ python pyinstaller.py myscript.py 

Me sale el error:

 8907 INFO: Looking for Python library libpython2.7.so Traceback (most recent call last): ... File "pyinstaller.py", line 91, in  raise IOError("Python library not found!") IOError: Python library not found! 

¿Cómo se puede arreglar esto?

Estoy usando:

Linux # 98-Ubuntu x86_64 GNU / Linux

Con python 2.7. Hay otros Pythons en el sistema, pero tengo establecido que:

 alias python="python2.7" 

En el servidor que estoy usando, solo hay /usr/lib/python2.6 y no /usr/lib/python2.7 pero python 2.7 es usado rutinariamente por mí y es funcional, etc., así que no veo por qué Sería un problema encontrar sus librerías. Hay un /usr/local/lib/libpython2.7.a .

En el servidor que estoy usando, solo hay /usr/lib/python2.6 y no /usr/lib/python2.7 pero python 2.7 es usado rutinariamente por mí y es funcional, etc., así que no veo por qué Sería un problema encontrar sus librerías. Hay un /usr/local/lib/libpython2.7.a.

Si no hay libpython2.7.so , por supuesto, será un problema encontrar esa biblioteca.

La razón por la que puedes usar el intérprete de Python es probablemente porque está enlazado estáticamente.

Hay dos maneras de resolver esto.

Primero, puedes instalar las bibliotecas compartidas para tu Python 2.7. Si está usando una versión anterior de Ubuntu que viene con Python 2.6, e instaló 2.7 desde el paquete python2.7 , esto debería ser solo una cuestión de instalar libpython2.7 .

Si ha obtenido su versión 2.7 de alguna otra fuente, el paquete Ubuntu libpython2.7 obviamente no funcionará, o funcionará al instalar una segunda copia de python2.7 , posiblemente sobrescribiendo algunos de los archivos que ya tiene, y Definitivamente te estoy confundiendo. De cualquier manera, no lo hagas. Obtenga el rest de Python para su versión 2.7 existente o desinstale la versión 2.7 y use los paquetes de Ubuntu. (Para algunas distribuciones de Python, “obtener el rest” es imposible, ya que si instala las bibliotecas compartidas, obtendrá un ejecutable de Python dinámicamente vinculado en lugar de uno estático. En ese caso, tendrá que desinstalarlo). y reinstalar.)

En segundo lugar, podría usar el PyInstaller static-lib de PyInstaller . Consulte el boleto 420 para obtener más detalles, pero la idea simple es que, si está habilitado, y PyInstaller cree que su plataforma debería tener un libpython2.7.so pero no puede encontrarlo, buscará un libpython2.7.a y estáticamente enlace que en su lugar. La última vez que necesité esto, no se registró en el maletero. De un vistazo rápido al ticket, parece que el parche ahora está incluido, pero está deshabilitado en las PyInstaller predeterminadas de PyInstaller , y el hito está establecido en 3.0, por lo tanto, es posible que aún tenga que comstackr manualmente PyInstaller para que esto funcione.

Una última cosa: es posible que tengas libpython2.7.so, pero simplemente se instala en algún lugar extraño como /opt/python27/lib o algo así, con /opt/python27 ninguna parte en tu camino, pero /usr/local/bin/python27 puede encontrarlo porque está construido explícitamente para sacar cosas de /opt/python27 . Este tipo de cosas tiende a ser un problema solo para usuarios de Mac con MacPorts o Fink, no usuarios de Linux, pero no es imposible. Puede ver la tabla dl para /usr/local/bin/python27 si cree que este podría ser el problema.

Hay 2 opciones: libpython * .so existe o no existe en su sistema. Puede comprobarlo con cualquier utilidad de búsqueda desde el directorio raíz. En caso de que el archivo ya exista, pero PyInstaller aún no pueda encontrarlo: el consejo más genérico es simplemente abrir el código de PyInstaller y encontrar el módulo responsable de encontrar esta biblioteca. Se puede hacer con editor simple. Vaya a este módulo y edítelo para entender qué está mal con su sistema específico. El código es simple y prematuro: le tomará ~ 5 minutos entender la razón. En mi caso, acabo de agregar LD_LIBRARY_PATH = / usr / local / lib a mi perfil de usuario (.bash_profile) y me aseguré de que este archivo * .so está dentro. En caso de que el archivo no esté en su sistema o tenga una versión incorrecta: simplemente reinstale python.

Como ya dijo @abarnert, el problema parece ser una comstackción estática de python. Para resolver este problema es necesario recomstackr Python, pero agregando el indicador –enable-shared esta vez:

  [root@machine ~]# ./configure --prefix=/usr/local --enable-shared [root@machine ~]# make && make altinstall 

Una vez que haga esto, encontrará la biblioteca solicitada ( libpython2.7.so.1.0 ) en / usr / local / lib ruta, así que no olvide agregar esa carpeta a la variable de entorno $ LD_LIBRARY_PATH:

  [root@machine tmp]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib