programar - Congelar un script de Python para cada sistema operativo
mejor sistema operativo para programar (8)
En los últimos años he escrito un pequeño programa en Python y ahora me gustaría distribuirlo, pero mi primer intento no me entusiasmó, 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.
Miré a mi alrededor durante semanas buscando 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. Solo 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 todas las aplicaciones en un ejecutable para cada sistema operativo (digamos los grandes: windows, mac, linux, obviamente un archivo ejecutable diferente para cada sistema operativo) sin la necesidad de instalar máquinas virtuales, o una versión similar. opciones Sospecho que es posible, ya que vi un montón de juegos ren''py empaquetados exactamente de la manera 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 admitir 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 sus configuraciones, registros, etc. en la primera ejecución, por lo que estos 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 archivos ejecutables creados pueden ser archivos pesados individuales que contienen casi todo lo necesario o archivos livianos y todo lo demás puede ser encontrado en una carpeta cercana; Realmente no tengo una preferencia por una solución o la otra.
Soy consciente de que esta pregunta aparece de vez en cuando y es probable que ya haya sido respondida, pero la última vez que encontré este tipo de pregunta se remonta a 2014, lo que parece que fue hace eones si consideramos qué tan rápido cambian las cosas en este campo. .
Edición : como no parece haber 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 el vino no siempre funciona correctamente y no puede encontrar nada para compilar para mac en linux. Según tengo entendido, el programa no debería requerir una compilación diferente para sistemas de 32/64 bits, pero si hay una forma fácil de compilar para cada posibilidad, sería bueno. Las máquinas virtuales siguen sin funcionar, ahora mismo no tengo el espacio en mi disco para configurar dos o más máquinas virtuales (esa es la gran desventaja de los discos ssd ...), y mucho menos el pago de licencias para sistemas operativos que ser usado varias veces al año para compilar un software libre.
¿Qué pasa con JAVA? ¿Envuelve su código python en java y distribúyalo como jar o .exe?
http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html
Puede encontrar este QA útil en su caso. ¿Distribuyendo mis scripts de Python como archivos JAR con Jython?
Como no lo he visto aquí todavía, pensé que iba a mencionar a Docker. Parece ser una máquina virtual distribuible que contiene un paquete o aplicación de algún tipo. Hay una edición gratuita de la comunidad disponible en github https://github.com/docker/docker . Nunca lo he usado, pero parece que se ajusta a todos sus criterios: liviano, gratuito y sin agendas para la plataforma. Sólo algo para explorar.
En el trabajo, hago algo como lo que quieres y terminé escribiendo mi propio código para hacerlo. Todo está basado en Linux, pero yo envío paquetes de Linux y Windows. Los paquetes incluyen el intérprete y la biblioteca de Python, y funcionan de manera idéntica, ya sea que el cliente ya tenga o no Python instalado.
Básicamente, necesita un pequeño programa que incruste el intérprete de Python y lo configure para cargar solo el código de Python que envía, ignorando cualquier Python instalado en el sistema. Escrito correctamente, este programa se puede compilar de forma cruzada para cada arquitectura que desee admitir. Luego envía las DLL de Python que necesita para la arquitectura, junto con un archivo zip que tiene el código de Python que utilizará (solo necesita los .pyc
.pyo
o .pyo
). Este archivo zip también debe contener la mayor cantidad de bibliotecas estándar que necesite.
Advertencias:
- Aún querrás máquinas virtuales para probar.
- Configurar los compiladores cruzados de C correctamente para cada arquitectura puede ser un desafío.
- Ni el
site.py
de Python ni el que usa virtualenv lo aísla completamente de una instalación de Python del sistema. Tuve que hacer mi propia versión desite.py
- Es fácil enlazar contra el sistema Python por error. Tenga mucho cuidado con la forma en que utiliza
pkg-config
y los argumentos del compilador en sus scripts de compilación. - Es fácil para Python intentar cargar la biblioteca Python del sistema por error. Tenga mucho cuidado al establecer la ruta de acceso de Python y, probablemente,
Py_IgnoreEnvironmentFlag
. - Para Windows, puede llegar bastante lejos con py2exe, y será más fácil de lo que sugiero. No uso py2exe principalmente porque estoy incrustando código Python en una aplicación que no es Python.
Debido a que mi aplicación está en Go con algunos Python, escribí mi envoltorio como un paquete Go que llama al código WSGI de Python a través de cgo. Puedes ver la mayoría del código de incrustación de Python here . Sin embargo, ese repo no es toda la historia: los scripts para la compilación personalizada de Python y los scripts de compilación y el código de inicialización de la aplicación en sí no son públicos en este momento.
La única plataforma que espera que los programas sean un paquete independiente es ms-windows. Esto es principalmente por razones históricas relacionadas con la cadena de herramientas nativa. Por ejemplo, hasta la versión 2016 de ms-toolchain (IIRC), los módulos de extensión de Python como numpy
deben compilarse exactamente con la misma versión de ms-toolchain que Python. Esto hace que la construcción de módulos de extensión para ms-windows sea un gran problema.
La mayoría de los sistemas operativos similares a UNIX tienen administración de paquetes funcionales (aunque en el OS-X de Apple esto es suministrado por un tercero). Esto hace que la instalación de Python sea relativamente fácil.
Lo que podría ser útil es empaquetar su aplicación en un archivo zip como lo hace youtube-dl
. He escrito un script llamado build.py
que hace esto para algunos de mis programas.
No sé qué piensa realmente al escribir la aplicación "congelación", pero si lo comprendo, debe compilar su código en un instalador, que simplemente instala todas las bibliotecas y archivos necesarios para ejecutar su programa, para que pueda manejar cualquier usuario de la computadora noob.
De acuerdo. Ahora tienes dos opciones:
A) Haga el instalador para cada sistema por separado : puede usar herramientas como Inno setup o PackageBuilder (en mac) para crear el instalador, verifique si Python ya está instalado (si no está instalado) y copie sus archivos + haga un acceso directo en el escritorio ( o algo por el estilo) + ejecute scripts externos (si los necesita) o si necesita binarios para Windows, puede usar p2exe o en mac Py2app . En Linux no hay nada de eso, pero si alguien que usa Linux usualmente es un usuario avanzado.
Si sé que no hay algo como el generador automático para todas las plataformas para construir instaladores de Python, pero si tiene algo de dinero, puede aumentar su trabajo con Bitrock Install Builder .
B) Cree su propio script : si el usuario ya tiene python, puede crear un script para descargar e instalar los archivos manualmente (por mi parte, la mejor solución si es un producto hecho para usuarios avanzados, pero si realiza alguna GUI, no será un problema para noob)
Unir las cosas primero.
- Python ya es multiplataforma
- El código Python se interpreta, no es un lenguaje compilado de forma nativa y no necesita compilar
- Existen métodos estándar en las
setuptools
desetuptools
Python para distribuir scripts ejecutables con compatibilidad multiplataforma - Las bibliotecas de Python de terceros pueden incluir código nativo (en C) que necesitarán compilarse durante la instalación o que los mantenedores de paquetes hayan disponible paquetes binarios. NumPy y matplotlib están en esta categoría y tienen paquetes binarios disponibles para Windows AFAIK.
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>
El paquete se puede distribuir como un módulo estándar de Python, instalable 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 obtener información sobre la configuración).
De lo contrario, se puede crear y distribuir a sus usuarios un paquete fuente o rueda binaria ( python setup.py sdist
y python setup.py bdist_wheel
respectivamente).
Las ruedas binarias deberán basarse en la plataforma en la que se instalarán, las distribuciones de origen funcionarán en cualquier plataforma, pero requerirán que el código se ejecute en la instalación, ya que contienen únicamente código de origen.
Tenga en cuenta que la creación / instalación de paquetes de ruedas binarias requiere la versión pip
> = 6.0
y setuptools
> = 26.0
.
Cuando se instala este paquete, un ejecutable de <consola cmd nombre aquí> estará disponible para ejecutarse en todas las plataformas en las que se pueda instalar el paquete correctamente.
Para un paquete de ejemplo simple que hace esto, vea el paquete 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.
Reacción inicial
- Para windows usa p2exe
- Para linux usar la congelación de python.
- Para macos use la misma congelación - debería funcionar (solo una conjetura, sostenida solo por una búsqueda de google)
(los cambios pueden ser necesarios para su programa, por ejemplo, no se puede usar __file__
)
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 curarse, incluyendo 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 de bat / sh para instalar todo.
Ren''Py
Mencionas a Ren''Py un par de veces. Su documentation describe cómo agregar código Python a un juego. La sección de declaraciones de Python incluso describe cómo agregar paquetes de terceros (por ejemplo, numpy y matplotlib). Puede generar archivos para Windows, Mac y Linux . Si puede ejecutar la aplicación de la manera que desee y ya está familiarizado con ella, entonces debe utilizarla.
PyInstaller
Otra opción es PyInstaller . En la sección Soporte de múltiples sistemas operativos , dice esto:
Si necesita distribuir su aplicación para más de un sistema operativo, por ejemplo, Windows y Mac OS X, debe instalar PyInstaller en cada plataforma y agrupar su aplicación por separado en cada una.
El segundo párrafo describe cómo hacer esto en una sola máquina:
Puede hacerlo desde una sola máquina utilizando la virtualización. El virtualBox gratuito o el VMWare y Parallels pagados le permiten ejecutar otro sistema operativo completo como "invitado". Usted configura una máquina virtual para cada sistema operativo "invitado". En él, instala Python, los paquetes de soporte que necesita su aplicación y PyInstaller.
PyInstaller anuncia soporte para numpy y matplotlib .
Máquinas virtuales y sistemas operativos alojados
Usted dijo que no tiene espacio en su SSD para máquinas virtuales. Puede comprar un disco duro externo USB y almacenar las máquinas virtuales en él. O podría utilizar un proveedor de alojamiento de sistema operativo. Puede utilizar Google para obtener más información sobre ellos. Si tiene preguntas sobre cómo usar un proveedor de alojamiento específico, debe crear nuevas preguntas.
Pruebas de plataforma cruzada
Incluso si utiliza Ren''Py, es casi seguro que tendrá que probar los resultados en máquinas virtuales o sistemas operativos alojados. La única forma de estar seguro de que su programa se ejecutará correctamente en otras plataformas es probarlo en esas plataformas. La solución de alojamiento le permite evitar "pagar licencias para sistemas operativos que se usarían varias veces al año para compilar un software gratuito" . Sin embargo, usted seguirá gastando dinero para el alojamiento.
El precio de la libre
Si su objetivo es desarrollar aplicaciones de Python para Windows, Mac y Linux sin gastar dinero, entonces probablemente esté atrapado en Ren''Py y confíe en los usuarios para que lo ayuden a probar su aplicación en sus sistemas operativos.