En los últimos años he escrito un pequeño programa agradable en python y ahora me gustaría distribuirlo, pero mi primer intento no encontró mucho entusiasmo, ya que a muchos usuarios potenciales no les gustó la idea de descargar e instalar python y todas las dependencias necesarias para ejecutar mi aplicación.
Busqué durante semanas una solución para compilar de alguna manera mi código en algo fácil de ejecutar para todos, pero no estoy realmente satisfecho con lo que encontré.
No tengo ningún problema con la idea de congelar la aplicación en lugar de compilarla realmente. Simplemente significa que el usuario final esperará unos segundos más para descargar la aplicación y ocupará más espacio en su disco duro.
Mi problema es encontrar una manera de empaquetar toda la aplicación en un ejecutable para cada sistema operativo (digamos los grandes: Windows, Mac, Linux, obviamente, un ejecutable diferente para cada sistema operativo) sin la necesidad de instalar máquinas virtuales o vino o similar. opciones Sospecho firmemente que es posible, ya que vi un montón de juegos ren'py empaquetados exactamente de la forma en que me gustaría empaquetar mi aplicación, pero no sé cómo obtener el mismo resultado para mi programa.
Esquemáticamente, mi aplicación requiere una consola para ejecutarse e incluye algunos paquetes caseros, numpy y matplotlib. También tiene un sistema para soportar múltiples idiomas que incluye dinámicamente un archivo de idioma, sobrescribiendo la configuración anterior:
exec('from lang.%s import lang' % language)Sospecho que esto podría crear algunos problemas. Finalmente, el programa requiere algunas carpetas para guardar su configuración, registros, etc. en la primera ejecución, por lo que también deben incluirse. Mi computadora ejecuta ubuntu mate 16.10 (x64) y la versión de python es 2.7, pero en el futuro planeo traducirlo a python 3. Los ejecutables creados pueden ser archivos pesados individuales que contienen casi todo lo necesario o archivos ligeros y todo lo demás puede ser encontrado en una carpeta cercana; Realmente no tengo preferencia por una solución u otra.
Soy consciente de que esta pregunta aparece de vez en cuando y probablemente ya fue respondida, pero la última aparición de este tipo de pregunta que pude encontrar se remonta a 2014, lo que parece hace mucho tiempo si consideramos la rapidez con que cambian las cosas en este campo. .
Editar : dado que parece que no hay una solución con las condiciones que propuse, puedo pensar en configurar algunos emuladores/envoltura/capa de compatibilidad/lo que sea para ejecutar un congelador para diferentes sistemas operativos, pero no estoy seguro de qué hacer. Leí aquí y allá que Wine no siempre funciona correctamente y no puedo encontrar nada para compilar para Mac en Linux. Según tengo entendido, el programa no debería requerir una compilación diferente para los sistemas de 32/64 bits, pero si hay una manera fácil de compilar para cada posibilidad, sería bueno. Las máquinas virtuales todavía no funcionan, en este momento no tengo espacio en mi disco para configurar dos o más máquinas virtuales (ese es el gran inconveniente de los discos ssd...), y mucho menos pagar las licencias de los sistemas operativos que utilizarse algunas veces al año para compilar un software libre.
Un par de cosas primero.
setuptools de Python para distribuir scripts ejecutables con compatibilidad multiplataforma Aquí hay un ejemplo de código setup.py para instalar un script ejecutable:
from setuptools import setup, find_packages setup(<...>, entry_points={'console_scripts': [ '<console cmd name here> = my_package.module:main' ]}) Donde está my_package.module , por ejemplo
my_package/module.py :
<..> def main(): <what to run when <console cmd name here> is executed> Luego, el paquete se puede distribuir como un módulo estándar de Python, que se puede instalar a través de pip . Si el código es de código abierto, se puede alojar en PyPi (consulte las instrucciones en el sitio de PyPi para saber cómo configurarlo).
De lo contrario, se puede crear y distribuir a sus usuarios un paquete de fuente o rueda binaria ( python setup.py sdist y python setup.py bdist_wheel respectivamente).
Las ruedas binarias deberán construirse en la plataforma en la que se instalarán, las distribuciones fuente funcionarán en cualquier plataforma, pero requerirán que se ejecute el código en la instalación, ya que contienen código fuente puro.
Tenga en cuenta que la creación/instalación de paquetes de ruedas binarias requiere una versión de pip >= 6.0 y herramientas de setuptools >= 26.0 .
Cuando se instala este paquete, un ejecutable <console cmd name here> estará disponible para ejecutarse en todas las plataformas en las que el paquete se pueda instalar correctamente.
Para ver un paquete de ejemplo simple que hace esto, consulte hello-world-python-package , específicamente su setup.py .
Consulte el sitio de pythonwheels para obtener más información sobre los paquetes de ruedas binarias.
Como aún no lo he visto aquí, pensé en mencionar Docker. Parece ser una VM distribuible que contiene un paquete o aplicación de algún tipo. Hay una edición comunitaria gratuita disponible en github https://github.com/docker/docker . Nunca lo he usado, pero parece cumplir con todos sus criterios: liviano, gratuito y independiente de la plataforma. Solo algo para explorar.
Reacción inicial
(Es posible que se necesiten cambios en su programa, por ejemplo, __file__ no se puede usar)
Posible enfoque alternativo al problema inicial
<...> no encontró mucho entusiasmo, ya que a muchos usuarios potenciales no les gustó la idea de descargar e instalar python
Tal vez las objeciones de los usuarios podrían solucionarse al incluir el instalador de Python junto a su programa. (ya sea el instalador de python real o http://portablepython.com/ )
es decir, agregue no solo el enlace al instalador, sino todos los instaladores y posiblemente los scripts bat/sh para instalar todo.