¿Cómo puedo distribuir los progtwigs de python?

Mi aplicación se ve así:

 main.py
 ventanas /
     __init__.py
     mainwindow.py
     ...
 modelo/
     __init__.py
     órdenes.py
     ...
 recursos /
     imagen1.png
     logo.jpg
     ...

El progtwig se inicia con main.py. ¿Hay una buena manera de crear una aplicación ‘final’ de ella? Estoy pensando en algo como py2exe / py2app, pero sin copiar el intérprete / los módulos de python en la aplicación donde uno solo tiene un ejecutable.

Eché un vistazo a distutils, pero parece que instala un progtwig en el directorio de Python, lo que no es habitual en plataformas que no sean de Linux.

En este momento solo copio toda la carpeta de origen en la máquina de destino y creo un alias para main.pyw en Windows. Algunos inconvenientes:

  • El icono es el icono de python predeterminado.
  • Tengo que crear el alias manualmente.
  • En mi directorio de origen hay muchos archivos adicionales como la carpeta de control de origen.
  • Tengo que cambiar el nombre de main.py a main.pyw manualmente.
  • Sería bueno si solo los archivos `.pyo * estén en la máquina de destino. No hay una razón real para ello, simplemente no me gusta tener archivos innecesarios.

¿Cómo se crea una buena distribución automatizada?

  • ¿para ventanas? (Esa es la única plataforma que tengo que soportar en este momento).
  • ¿para Mac?
  • para linux?

La forma normal de distribuir aplicaciones de Python es con distutils . Está hecho tanto para distribuir módulos de tipo Python de biblioteca como para aplicaciones de Python, aunque no sé cómo funciona en Windows. En cualquier caso, tendría que instalar Python en Windows por separado si utiliza distutils.

Probablemente te recomiendo que lo distribuyas con disutils para Linux, y Py2exe o algo similar para Windows. Para OS XI no lo sé. Si es una aplicación de usuario final, probablemente querrá un tipo de imagen de disco, no sé cómo hacerlo. Pero lea esta publicación para obtener más información sobre la experiencia del usuario de la misma. Para una aplicación hecha para progtwigdores, probablemente esté de acuerdo con una instalación de tipo distutils en OS X también.

Recomiendo encarecidamente Pyinstaller , que es compatible con todas las plataformas principales sin problemas. Al igual que py2exe y py2app, produce un ejecutable estándar en Windows y un paquete de aplicaciones en OS X, pero también tiene la ventaja de hacer un trabajo fantástico de resolver automáticamente las dependencias comunes e incluirlas sin ajustes de configuración adicionales.

También tenga en cuenta que si está implementando Python 2.6 en Windows, debe aplicar este parche al tronco de Pyinstaller.

Indicó que no necesita un instalador, pero Inno Setup es una opción fácil de usar y rápida de configurar para la plataforma Windows.

El squeeze.py Fredrik Lundh puede crear un solo archivo que no contenga el intérprete de Python, sino que contenga un squeeze.py de squeeze.py . Con los argumentos correctos, puede incluir otros archivos, módulos, etc. en el archivo de resultados. Lo utilicé con éxito en un proyecto. El progtwig resultante se ejecutó en OS X, Linux y Windows sin ningún problema.

PS : Cada máquina debe tener un intérprete de Python que sea compatible con el código de bytes generado por squeeze.py. Puede generar diferentes versiones de bytecode para diferentes versiones de Python, si es necesario (simplemente ejecute squeeze.py con la versión correcta de Python).

Puedo estar equivocado, pero IronPython no tiene un comstackdor incorporado para Windows?

http://www.ironpython.net

[EDITAR]

Pruebe Cx_Freeze, el mejor comstackdor de .py a .exe (más algunos .dlls) que he usado.

http://cx-freeze.sourceforge.net/

Si está distribuyendo en Windows, use un instalador para instalar todos los archivos relevantes / interpeter lo que sea necesario. Distribuir un setup.exe. Esa es la mejor manera en windows. De lo contrario los usuarios se quejarán.

Creo que también vale la pena mencionar PEX (considerando más la atención que recibió esta pregunta y menos la pregunta en sí). Según su propia descripción :

Los archivos PEX son entornos virtuales de Python ejecutables autocontenidos. Más específicamente, son archivos zip construidos cuidadosamente con #!/usr/bin/env python y __main__.py especial que le permite interactuar con el tiempo de ejecución PEX. Para obtener más información sobre las aplicaciones zip, consulte PEP 441 .

Me topé con esto cuando leí una descripción general del empaque para python . Ellos publicaron esta bonita foto allí: introduzca la descripción de la imagen aquí

Para resumir: si puede darse el lujo de que Python se instale en la máquina de destino, use PEX para producir un “ejecutable” autocontenido que probablemente tendrá un tamaño de archivo menor que un ejecutable producido por PyInstaller, por ejemplo.

La forma más conveniente * multiplataforma de distribuir aplicaciones de escritorio Python es confiar en el administrador de paquetes conda multiplataforma. Hay varias herramientas que lo utilizan:

  • Miniconda-Install : scripts de powershell / bash que descargan automáticamente Miniconda y crean un entorno de conda aislado para la aplicación. Es compatible con pip pero parece que no se mantiene y tiene problemas de descarga https.
  • Proyecto Anaconda y (conda) constructor por Continuum. Ambos usan conda. (Conda) el constructor parece ser capaz de crear instaladores autónomos e incluso el instalador de NSIS en Windows pero no admite pip. Parecen comportarse como los instaladores de Anaconda / Miniconda.
  • PyAppShare : el usuario final instala Miniconda / Anaconda primero (como un entorno de ejecución). Luego, el script de instalación individual batch / bash crea un entorno conda aislado a partir de las especificaciones de yaml. La aplicación también es un paquete conda / pip que se instala en el entorno y se crea un punto de entrada ejecutable. Los accesos directos multiplataforma de escritorio y progtwigs se crean automáticamente. Activan el entorno e inician la aplicación. Soporta pip.

* Lo más conveniente para el desarrollador. Suficientemente conveniente para el usuario final.