Cómo generar una aplicación ejecutable portable (que se pueda ejecutar en otros equipos Linux sin instalar nada) a partir de código fuente Python (.py) en Linux. Indicamos el procedimiento tanto para distribuciones Linux Debian (Ubuntu, Mint, PureOS, Kali, Deepin, etc.), como Red Hat (CentOS, Rocky, Fedora, AlmaLinux, Oracle Linux, ClearOS, etc.).

Requisitos para generar aplicación ejecutable portable en Linux a partir de código Python

Necesitaremos disponer de Python instalado en el equipo en el que generaremos la aplicación Python portable. Ejecutando el siguiente comando sabremos si lo tenemos instalado:

Si el comando anterior nos devuelve la versión instalada de Python en el equipo, será porque está disponible. En caso de devolver error, tendremos que instalar Python. En las distribuciones habituales y versiones actuales de Linux suele venir instalado.

Si necesitamos instalarlo, en distribuciones Debian (Ubuntu, Mint, PureOS, Kali, Deepin, etc.), ejecutaremos el siguiente comando:

En el caso de distribuciones Red Hat (CentOS, Rocky, Fedora, AlmaLinux, Oracle Linux, ClearOS, etc.), ejecutaremos este otro comando:

Necesitaremos instalar pip, que es el comando Python para instalar paquetes en el propio entorno Python. Comprobaremos si lo tenemos ya instalado, ejecutando el comando:

Si nos devuelve la versión de pip3 es porque ya está instalado. En caso de devolvernos error, lo instalaremos. En distribuciones Debian, ejecutaremos este comando:

Y en el caso de distribuciones Red Hat, ejecutaremos este otro comando:

Una vez instalado pip, usaremos este comando para instalar PyInstaller, que es la herramienta Python que usaremos para generar las aplicaciones portables Linux con código fuente Python. Para instalar PyInstaller, ejecutaremos este comando (en cualquier distribución Linux):

Si todo es correcto, el comando pip3 descargará e instalará el paquete pyinstaller en el equipo:

Si ya tenemos PyInstaller y queremos actualizarlo a la última versión, ejecutaremos el comando:

En el caso de que nuestra aplicación Python utilice algún paquete/librería adicional, como en el ejemplo que usaremos de la aplicación metaPDF, que requiere del paquete pypdf, tendremos que instalarlo en el equipo que vayamos a usar para generar el ejecutable portable. Por ejemplo, para pypdf, ejecutaremos el comando:

Generar ejecutable portable único en Linux desde código Python con PyInstaller

Necesitaremos, evidentemente, los ficheros de código fuente Python de nuestra aplicación, que tendremos, habitualmente, en una carpeta. Accederemos a dicha carpeta (donde tengamos los ficheros .py de la aplicación Python) con:

En este caso, queremos generar el ejecutable portable de una aplicación Python que obtiene y modifica los metadatos de un fichero PDF. Dicha aplicación tiene un único fichero llamado metaPDF.py, que contiene todo el código Python. Para generar el ejecutable portable Linux, ejecutaremos el siguiente comando:

La herramienta PyInstaller creará dos carpetas y un fichero .spec. La carpeta «dist» contiene nuestro único fichero ejecutable portable, que será el que pasemos a todos los equipos donde queramos que se ejecute:

Probaremos el fichero generado en este mismo equipo. En este caso, se trata de una aplicación que obtiene los metadatos de un fichero PDF que se le pase como parámetro. Para ejecutarla y mostrar los metadatos del fichero PDF /usr/share/doc/shared-mime-info/shared-mime-info-spec.pdf, ejecutaremos el siguiente comando:

Verificando que, efectivamente, el ejecutable portable generado funciona correctamente, devolviéndonos los metadatos del fichero PDF (título, asunto, autor, creador, productor, fecha de creación, fecha de modificación y número de páginas):

Generar ejecutable Linux con librerías separadas desde código Python con PyInstaller

Como en el caso anterior, necesitaremos los ficheros de código fuente Python de nuestra aplicación. Accederemos a la carpeta donde tengamos los ficheros .py de la aplicación Python, con:

La aplicación de ejemplo, como hemos comentado anteriormente, tiene un único fichero llamado metaPDF.py, que contiene todo el código Python. Para generar la aplicación portable Linux con las librerías separadas, ejecutaremos el siguiente comando:

La herramienta PyInstaller creará dos carpetas y un fichero .spec. La carpeta «dist» será la que pasaremos a todos los equipos donde queramos que se ejecute nuestra aplicación. Dentro de esta carpeta, veremos que nos ha generado el ejecutable y una subcarpeta llamada _internal que contiene las librerías necesarias:

Los ficheros que deberemos pasar a los equipos Linux serán el ejecutable, en este caso metaPDF y la carpeta _internal.

Probar aplicación portable Python en otro equipo Linux

Transferiremos el fichero ejecutable generado (o si hemos optado por la opción de fichero ejecutable más la carpeta _internal, transferiremos ambos) a otro equipo. Por ejemplo, en este caso hemos usado el comando scp para transferir el fichero metaPDF ejecutable portable a otro equipo Linux, con IP 192.168.1.6:

Una vez transferido, accederemos al otro equipo Linux y a la carpeta donde lo hayamos copiado:

Para ejecutar nuestra aplicación Python portable, únicamente tendremos que añadir ./ delante del nombre del ejecutable. En este caso, al necesitar argumentos, podemos usar el parámetro -h para mostrar los que admite:

Nos devolverá los argumentos que soporta:

Por ejemplo, para mostrar los metadatos del fichero PDF shared-mime-info-spec.pdf de nuestro equipo, ejecutaremos la aplicación con los siguientes argumentos:

Y para limpiar los metadatos de un fichero PDF, ejecutaremos:

Ahora, si volvemos a mostrar los metadatos del fichero PDF, veremos que se han eliminado (en este ejemplo, el creador y el productor):

Consideraciones a tener en cuenta para distribuciones de Linux más antiguas

Si queremos usar la aplicación portable generada en distribuciones de Linux más antiguas que la que hemos usado para generar el ejecutable, puede que al ejecutarla nos muestre errores como estos:

Esto es así porque PyInstaller buscará las bibliotecas de ejecución de ficheros: libc y glibc en la misma versión que las que haya en el equipo donde se generó el ejecutable. Lo mismo ocurre con las bibliotecas libstdc++.so.6, libfontconfig.so.1 y libfreetype.so.6

Si lo ejecutamos en equipos que tengan versiones inferiores de estas librerías, la aplicación no se ejecutará.

Lo recomendable para estos casos es generar el ejecutable en la distribución de Linux más antigua, porque sí hay compatibilidad hacia arriba.

Lo mismo ocurre con sistemas de 32 y 64 bits, si generamos la aplicación en un equipo de 64 bits, el ejecutable sólo funcionará en equipos de 64 bits, y viceversa. Si ejecutamos la aplicación en un equipo de longitud de palabra diferente, por ejemplo un ejecutable de 64 bits en un equipo de 32 bits, nos mostrará este error:

En este caso, la solución es generar dos ejecutables portables, uno para 32 bits y otro para 64 bits.

Descarga de la aplicación metaPDF (código fuente y ejecutables para Linux y Windows) usada en este tutorial

A continuación, tenéis disponible el enlace para la descarga de la aplicación metaPDF que se ha usado como ejemplo para este tutorial, tanto el código fuente como los ejecutables portables para Windows y Linux: