Python, potente y versátil como es, carece de algunas capacidades clave fuera de la caja. Por un lado, Python no proporciona ningún mecanismo nativo para compilar un programa Python en un paquete ejecutable independiente.

para ser justos, el caso de uso original de Python nunca llamó a paquetes independientes. Los programas Python, en general, se han ejecutado in situ en sistemas donde vivía una copia del intérprete Python. Pero la creciente popularidad de Python ha creado una mayor demanda para ejecutar aplicaciones Python en sistemas sin tiempo de ejecución Python instalado.,

varios terceros han diseñado soluciones para implementar aplicaciones Python independientes. La solución más popular del grupo, y la más madura, es PyInstaller. PyInstaller no hace que el proceso de empaquetar una aplicación Python sea totalmente indoloro, pero va un largo camino allí.

en este artículo exploraremos los conceptos básicos del uso de PyInstaller, incluyendo cómo funciona PyInstaller, cómo usar PyInstaller para crear un ejecutable Python independiente, cómo ajustar los ejecutables Python que cree y cómo evitar algunos de los errores comunes que conlleva el uso de PyInstaller.,

crear un paquete PyInstaller

PyInstaller es un paquete Python, instalado con pip(pip install pyinstaller). PyInstaller se puede instalar en su instalación predeterminada de Python, pero es mejor crear un entorno virtual para el proyecto que desea empaquetar e instalar PyInstaller allí.

PyInstaller funciona leyendo su programa Python, analizando todas las importaciones que realiza y agrupando copias de esas importaciones con su programa. PyInstaller lee en su programa desde su punto de entrada., Por ejemplo, si el punto de entrada de su programa es myapp.py, ejecutaría pyinstaller myapp.py para realizar el análisis. PyInstaller puede detectar y empaquetar automáticamente muchos paquetes comunes de Python, como NumPy, pero es posible que necesite proporcionar sugerencias en algunos casos. (Más sobre esto más adelante.)

Después de analizar su código y descubrir todas las bibliotecas y módulos que utiliza, PyInstaller genera un archivo «spec».»Un script Python con la extensión .spec, este archivo incluye detalles sobre cómo debe empaquetarse su aplicación Python., La primera vez que ejecute PyInstaller en su aplicación, PyInstaller generará un archivo de ESPECIFICACIONES desde cero y lo rellenará con algunos valores predeterminados sanos. No descartes este archivo; ¡es la clave para refinar un despliegue de PyInstaller!

finalmente, PyInstaller intenta producir un ejecutable desde la aplicación, incluido con todas sus dependencias. Cuando termine, aparecerá una subcarpeta llamada dist (de forma predeterminada, puede especificar un nombre diferente) en el directorio del proyecto., Esto a su vez contiene un directorio que es su aplicación incluida: tiene un archivo .exe para ejecutar, junto con todas las bibliotecas y otros archivos complementarios necesarios.

todo lo que necesita hacer para distribuir su programa, entonces, es empaquetar este directorio como un archivo .zip o algún otro paquete. Normalmente, el paquete deberá extraerse en un directorio donde el usuario tenga permisos de escritura para poder ejecutarse.

IDG

Un .Spec file se utiliza para crear un ejecutable con PyInstaller., Observe los espacios de nombres listados en excludes. Estos se dejarán fuera del paquete creado para ahorrar espacio.

probar un paquete de PyInstaller

hay una buena posibilidad de que su primer intento de usar PyInstaller para empaquetar una aplicación no sea completamente exitoso.

para comprobar si su paquete PyInstaller funciona, vaya al directorio que contiene el ejecutable incluido y ejecute el archivo .exe desde la línea de comandos., Si no se ejecuta, los errores que verá impresos en la línea de comandos deben proporcionar una pista sobre lo que está mal.

la razón más común por la que un paquete de PyInstaller falla es que PyInstaller no pudo empaquetar un archivo requerido. Tales archivos faltantes caen en algunas categorías:

  • importaciones ocultas o faltantes: a veces PyInstaller no puede detectar la importación de un paquete o biblioteca, normalmente porque se importa dinámicamente. El paquete o biblioteca tendrá que ser especificado manualmente.,
  • archivos independientes faltantes: si el programa depende de archivos de datos externos que necesitan ser incluidos con el programa, PyInstaller no tiene forma de saberlo. Tendrás que incluir manualmente los archivos.
  • binarios faltantes: aquí de nuevo, si su programa depende de un binario externo como a .DLL que PyInstaller no puede detectar, deberá incluirlo manualmente.

La buena noticia es que PyInstaller proporciona una manera fácil de lidiar con los problemas anteriores., El archivo .spec creado por PyInstaller incluye campos que podemos rellenar para proporcionar los detalles que PyInstaller perdió.

abra el archivo .spec en un editor de texto y busque la definición del objeto Analysis. Varios de los parámetros pasados a Analysis son listas en blanco, pero se pueden editar para especificar los detalles que faltan:

  • hiddenimports para importaciones ocultas o faltantes: agregue a esta lista una o más cadenas con los nombres de las bibliotecas que desea incluir con su aplicación., Si desea agregar pandas y bokeh, por ejemplo, se especifica que como . Tenga en cuenta que las bibliotecas en cuestión deben estar instaladas en la misma instancia de Python donde está ejecutando PyInstaller.
  • datas para los archivos independientes que faltan: agregue aquí una o más especificaciones para los archivos en el árbol del proyecto que desea incluir con su proyecto., Cada archivo tiene que ser pasado como una tupla indicando la ruta relativa al archivo en el directorio del proyecto y la ruta relativa dentro del directorio de distribución donde desea colocar el archivo. Por ejemplo, si tiene un archivo ./models/mainmodel.datque desea incluir con su aplicación, y desea colocarlo en un subdirectorio coincidente en su directorio de distribución, utilizaría ('./models/mainmodel.dat','./models')como una entrada en la lista hiddenimports. Tenga en cuenta que puede usar comodines globpara especificar más de un archivo.,
  • binariespara los binarios independientes que faltan: al igual que con datas, puede usar binaries para pasar una lista de tuplas que especifican las ubicaciones de los binarios en el árbol del proyecto y sus destinos en el directorio de distribución. Una vez más, puede usar comodines de estilo glob.

tenga en cuenta que cualquiera de las listas pasadas a Analysisse pueden generar previamente mediante programación en el archivo .spec., Después de todo, el archivo .spec es solo un script Python con otro nombre.

después de realizar cambios en el archivo .spec, vuelva a ejecutar PyInstaller para reconstruir el paquete. Sin embargo, a partir de Ahora, asegúrese de pasar el archivo modificado .spec como parámetro (por ejemplo, pyinstaller myapp.spec). Pruebe el ejecutable como antes. Si algo sigue roto, puede volver a editar el archivo .spec y repetir el proceso hasta que todo funcione.,

finalmente, cuando esté satisfecho de que todo funciona según lo previsto, es posible que desee editar el archivo .spec para evitar que su aplicación empaquetada presente una ventana de línea de comandos cuando se inicie. En la configuración del objeto EXE en el archivo .spec, establezca console=False. Suprimir la consola es útil si su aplicación tiene una interfaz gráfica de usuario y no desea que una ventana de línea de comandos falsa lleve a los usuarios por mal camino. Por supuesto, no cambie esta configuración si su aplicación requiere una línea de comandos.,

refinar un paquete PyInstaller

Una vez que tenga su aplicación empaquetada con PyInstaller y funcionando correctamente, lo siguiente que probablemente querrá hacer es reducirla un poco. Los paquetes PyInstaller no son conocidos por ser esbeltos.

debido a que Python es un lenguaje dinámico, es difícil predecir exactamente lo que se necesitará en tiempo de ejecución por un programa determinado. Por esa razón, cuando PyInstaller detecta una importación de Paquetes, incluye todo en ese paquete, sea o no realmente utilizado en tiempo de ejecución por su programa.

Aquí están las buenas noticias., PyInstaller incluye un mecanismo para excluir selectivamente paquetes enteros, o espacios de nombres individuales dentro de paquetes. Por ejemplo, digamos que su programa importa el paquete foo, que incluye foo.bar y foo.bip. Si sabe que su programa solo usa lógica en foo.bar, puede excluir de forma segura foo.bip y ahorrar algo de espacio.

para hacer esto, utiliza el parámetro excludes pasado al objeto Analysis en el archivo .spec., Puede pasar una lista de nombres (módulos de nivel superior o espacios de nombres punteados) para excluirlos del paquete. Por ejemplo, para excluir foo.bip, basta con especificar .

IDG

El Directorio entregable creado por PyInstaller. Debido a la gran cantidad de archivos en el directorio, un proyecto de Instalador de terceros como NSIS puede ser utilizado para empaquetar el directorio en un archivo autoextraíble, y crear automáticamente un acceso directo al ejecutable.,

una exclusión común que puede hacer es tkinter, la biblioteca de Python para crear interfaces gráficas de usuario simples multiplataforma. Por defecto, tkinter y todos sus archivos de soporte están empaquetados con un proyecto PyInstaller. Si no está utilizando tkinter en su proyecto, puede excluirlo agregando 'tkinter'a la lista excludes. Omitir tkinter reducirá el tamaño del paquete en alrededor de 7 MB.

otra exclusión común son los conjuntos de pruebas., Si un paquete que importa su programa tiene un conjunto de pruebas, el conjunto de pruebas podría terminar siendo incluido en su paquete PyInstaller. A menos que realmente ejecute el conjunto de pruebas en su programa implementado, puede excluirlo de forma segura.

tenga en cuenta que los paquetes creados utilizando exclusiones deben ser probados a fondo antes de ser utilizados. Si termina excluyendo la funcionalidad que se utiliza en algún escenario futuro que no anticipó, su aplicación se romperá.

PyInstaller tips

  • Cree su paquete PyInstaller en el sistema operativo en el que planea implementarlo., PyInstaller no soporta compilaciones multiplataforma. Si necesita implementar su aplicación Python independiente en sistemas MacOS, Linux y Windows, deberá instalar PyInstaller y crear versiones separadas de la aplicación en cada uno de estos sistemas operativos.
  • Construya su paquete PyInstaller a medida que desarrolla su aplicación. Tan pronto como sepa que implementará su proyecto con PyInstaller, cree su archivo .spec y comience a refinar el paquete PyInstaller en paralelo con el desarrollo de su aplicación., De esta manera, puede agregar exclusiones o inclusiones a medida que avanza y probar la forma en que se implementan las nuevas funciones con la aplicación a medida que las Escribe.
  • No utilice el modo --onefile de PyInstaller. PyInstaller incluye un conmutador de línea de comandos, --onefile, que empaqueta toda su aplicación en un solo ejecutable autoextraíble. Esto suena como una gran idea-solo tienes que entregar un archivo! – pero tiene algunos escollos. Cada vez que ejecute la aplicación, primero debe descomprimir todos los archivos dentro del ejecutable en un directorio temporal., Si la aplicación es grande (200MB, por ejemplo), desempaquetar puede significar un retraso de varios segundos. Utilice el modo de directorio único predeterminado en su lugar, y simplemente empaquete todo como un archivo .zip.
  • Crea un instalador para tu aplicación PyInstaller. Si desea alguna forma de implementar su aplicación que no sea a .archivo zip, considere el uso de una utilidad de instalación como el sistema de instalación de scripts Nullsoft de código abierto. Añade muy poca sobrecarga al tamaño del entregable y le permite configurar muchos aspectos del proceso de instalación, como la creación de accesos directos a su ejecutable.,
  • no esperes aceleraciones. PyInstaller es un sistema de empaquetado, no un compilador o un optimizador. El código empaquetado con PyInstaller no se ejecuta más rápido de lo que lo haría cuando se ejecuta en el sistema original. Si desea acelerar el código Python, use una biblioteca C-accelerated adecuada para la tarea, o un proyecto como Cython.,w para acelerar Python
  • Cómo instalar Python de forma inteligente
  • Mejor Python gestión de proyectos con la Poesía
  • Virtualenv y venv: Python entornos virtuales explicado
  • Python virtualenv y venv hacer y no hacer
  • Python roscado y subprocesos explicado
  • ¿Cómo utilizar el depurador de Python
  • Cómo utilizar timeit a perfil el código de Python
  • Cómo utilizar cProfile a perfil el código de Python
  • empezar con async en Python
  • Cómo utilizar asyncio en Python
  • ¿Cómo convertir Python, JavaScript (y de nuevo)