¿Cómo puedo distribuir programas de Python?

102

Mi aplicación se ve así:

main.py
ventanas /
    __init__.py
    mainwindow.py
    ...
modelo/
    __init__.py
    orders.py
    ...
recursos /
    image1.png
    logo.jpg
    ...

El programa se inicia con main.py. ¿Existe una buena manera de crear una aplicación 'final' a partir de ella? Estoy pensando en algo como py2exe / py2app, pero sin copiar el intérprete / módulos de Python en la aplicación donde uno solo tiene un ejecutable.

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

Por el momento, solo copio toda la carpeta de origen en la máquina de destino y creo un alias main.pywen 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 main.pya main.pywmanualmente.
  • Sería bueno si solo los archivos `.pyo * estuvieran 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 admitir en este momento).
  • ¿para Mac?
  • para linux?
Georg Schölly
fuente
2
"Eché un vistazo a distutils, pero parece que instala un programa en el directorio de Python, lo cual no es habitual en plataformas que no son Linux". ¿Por qué dices eso? ¿Qué texto leíste que decía eso? Ciertamente no es cierto, ¿de dónde sacaste esa impresión?
S.Lott
Posible duplicado de programas
SebasSBM

Respuestas:

37

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

Probablemente le recomiendo que lo distribuya con disutils para Linux y Py2exe o algo similar para Windows. Para OS X, no lo sé. Si se trata de una aplicación de usuario final, probablemente desee 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. Para una aplicación hecha para programadores, probablemente también esté de acuerdo con una instalación de tipo distutils en OS X.

Lennart Regebro
fuente
1
Mac y Linux no son tan importantes en este momento. Py2app crea paquetes .app. Y creo que el envío de aplicaciones mac en .dmg está desactualizado, uno debería usar .zip. ¿Es posible usar distutils para crear un directorio disty copiar todos los archivos relevantes en él?
Georg Schölly
1
@gs: el comando sdist creará un archivo tar de todos los archivos fuente.
Martin v. Löwis
5
@gs: Enviar aplicaciones de Mac en .dmg es realmente muy común. Los .dmg son imágenes de disco y no un formato para aplicaciones (sería .app). Por lo tanto, a menudo encontrará una sola aplicación dentro de un .dmg, junto con algún archivo README.
Eric O Lebigot
2
@gs No sé por qué quiere que distutils haga un directorio dist y copie los archivos allí, puede hacerlo usted mismo. Distutils hace muchas cosas, incluida la creación de instaladores de Windows, y desde Python 2.6 también crea enlaces en el menú Inicio. Sin embargo, requerirá que instale Python por separado, por lo que para una aplicación de usuario final, creo que py2exe es una mejor solución, porque incluye su propio Python. El envío / instaladores para OS X es discutido en detalle por Alexander Limi en su bloggpost, por lo que le cito.
Lennart Regebro
61

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 al 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.

Daniel Naab
fuente
3
No estoy seguro de que sea una exageración. Empaquetar una aplicación con Pyinstaller en realidad puede ser más fácil que otros métodos, especialmente aquellos con dependencias en extensiones c ... tan simple como una llamada de línea de comandos en la mayoría de los casos. La instalación de Python + dependencias + la aplicación en sí (ya sea a través de distutils, etc., o solo un archivo zip) es más complicada, especialmente si el desarrollador no puede configurar manualmente la máquina de destino y necesita proporcionar instrucciones al cliente. Al menos en Windows, creo que ese estilo de distribución tiene sentido.
Daniel Naab
1
Un pequeño inconveniente con pyinstaller, cuando usas el ejecutable creado con pyinstaller, el inicio de la ejecución toma algunos segundos.
JuanPablo
1
Exactamente lo que estaba buscando. A veces necesito dejar que mis scripts se ejecuten en computadoras donde no puedo instalar nada. Lo que necesito es un solo ejecutable sin dependencias externas. Puedo dedicar unos segundos a la puesta en marcha. ¡Gracias!
CodeMonkey
No se recomienda para aplicaciones pequeñas, ya que un Hello worldprograma simple ocuparía 500 MB de espacio y 3-5 segundos de tiempo de inicialización.
Raf
Puede evitar esta cantidad de espacio usando un entorno separado para distribuir su aplicación (usando venv o pyenv, por ejemplo)
Alexander Santos
4

Fredrik Lundh squeeze.pypuede crear un solo archivo que no contiene el intérprete de Python, sino que contiene un código de bytes. Con los argumentos correctos, puede incluir otros archivos, módulos, etc. en el archivo de resultados. Lo usé con éxito en un proyecto. ¡El programa resultante se ejecutó en OS X, Linux y Windows sin ningún problema!

PD : 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).

Eric O Lebigot
fuente
4

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 Python ejecutables autónomos. Más específicamente, son archivos zip cuidadosamente construidos con un #!/usr/bin/env pythony especial __main__.pyque le permite interactuar con el tiempo de ejecución de PEX. Para obtener más información sobre las aplicaciones zip, consulte PEP 441 .

Me encontré con él cuando leí una descripción general del empaquetado para Python . Publicaron esta bonita foto allí: ingrese la descripción de la imagen aquí

Para resumir: si puede permitirse confiar en que Python se instale en la máquina de destino, utilice PEX para producir un "ejecutable" autónomo que probablemente tendrá un tamaño de archivo más pequeño que un ejecutable producido por PyInstaller, por ejemplo.

usuario3389669
fuente
1

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

Byron Whitlock
fuente
1
No necesito un instalador porque solo hay un usuario que va a usar el programa. Pero, por supuesto, al escribir un programa para más usuarios, es imprescindible en Windows.
Georg Schölly
1
@gs: Oh, solo un usuario. Bien, entonces recomendaría hacer un paquete distutils básico, ya sea una distribución fuente o un instalador binario de Windows. Definitivamente es una forma fácil y agradable de distribuir un módulo de Python.
Lennart Regebro
0

La forma multiplataforma más conveniente * de distribuir aplicaciones de escritorio de 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. Admite pip, pero parece que no se mantiene y tiene problemas de descarga https.
  • Proyecto Anaconda y constructor (conda) de Continuum. Ambos usan conda. (conda) parece ser capaz de crear instaladores autónomos e incluso el instalador NSIS en Windows, pero no es compatible con pip. Parece comportarse como instaladores de Anaconda / Miniconda.
  • PyAppShare : el usuario final instala Miniconda / Anaconda primero (como un entorno de ejecución). Luego, el script de instalación único por lotes / bash crea un entorno de conda aislado a partir de la especificación 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. Se crean automáticamente accesos directos de programas y escritorios multiplataforma. Activan el entorno e inician la aplicación. Soporta pip.

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

Peter Zagubisalo
fuente