2009-10-13 67 views
75

Mi solicitud es el siguiente:¿Cómo puedo distribuir programas de Python?

 
main.py 
windows/ 
    __init__.py 
    mainwindow.py 
    ... 
model/ 
    __init__.py 
    orders.py 
    ... 
resources/ 
    image1.png 
    logo.jpg 
    ... 

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

He echado un vistazo a distutils, pero parece que instala un programa en el directorio de Python, que no es habitual en plataformas que no sean de Linux.

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

  • El ícono es el ícono de python predeterminado.
  • Tengo que crear el alias manualmente.
  • En mi directorio fuente hay una gran cantidad de archivos adicionales como la carpeta de control de origen.
  • Tengo que cambiar el nombre 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 eso, simplemente no me gusta tener archivos innecesarios.

¿Cómo se puede crear una buena distribución automatizada?

  • para windows? (Esa es la única plataforma que tengo que admitir en este momento).
  • para mac?
  • para Linux?
+2

"Yo tenía un aspecto en distutils, pero esto parece que instala un programa en el directorio de Python, que no es habitual en las plataformas no Linux. " ¿Por qué dices eso? ¿Qué texto leíste que dijera eso? Ciertamente no es cierto, ¿de dónde sacaste esa impresión? –

+0

Posible duplicado de [Distribución de programas escritos en Python] (http://stackoverflow.com/questions/4190635/distributing-programs-written-in-python) – SebasSBM

Respuesta

29

La forma normal de distribución de aplicaciones Python es con distutils. Está hecho para distribuir módulos tipo python de tipo biblioteca y aplicaciones 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 recomendaría 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, es probable que desee un tipo de imagen de disco, no sé cómo hacerlo. Pero lea this post para obtener más información sobre la experiencia del usuario de la misma. Para una aplicación hecha para programadores, probablemente también esté bien con una instalación tipo distutils en OS X.

+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 debe usar .zip. ¿Es posible utilizar distutils para crear un directorio 'dist' y copiar todos los archivos relevantes en eso? –

+1

@gs: el comando sdist creará un archivo tar de todos los archivos fuente. –

+4

@gs: Enviar aplicaciones de Mac en .dmg es realmente muy común. .dmg son imágenes de disco, y no un formato para aplicaciones (eso sería .app). Por lo tanto, a menudo se encuentra una sola .app dentro de .dmg, junto con algún archivo README. – EOL

1

Si está distribuyendo en Windows, use un installer 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.

+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 que es imprescindible en Windows. –

+1

@gs: Oh, solo un usuario. Bien, entonces recomendaría hacer un paquete básico de distutils, ya sea una distribución de fuente o un instalador binario de Windows. Esa es definitivamente una manera fácil y agradable de distribuir un módulo de Python. –

47

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 tiene el beneficio de hacer un trabajo fantástico de auto-resolución de dependencias comunes y de incluirlas sin ajustes de configuración adicionales.

También tenga en cuenta que si está implementando Python 2.6 en Windows, debe aplicar this patch a la troncal de Pyinstaller.

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

+0

Overkill para este caso, ya que solo tiene un usuario, pero una buena recomendación generalmente de un software que olvidé que existía. +1 –

+3

No estoy seguro de que sea excesivo. Combinar 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 comando de una línea en la mayoría de los casos. Instalar Python + dependencias + la propia aplicación (ya sea a través de distutils, etc., o simplemente un archivo zip) es más complicado, 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 el estilo de distribución tiene sentido. –

+1

Un pequeño inconveniente con el instalador de piro, cuando se usa el ejecutable creado con el instalador de pirogramos, el comienzo de la ejecución demora algunos segundos. – JuanPablo

5

Fredrik Lundh's squeeze.py puede crear un único archivo que no contenga el intérprete de Python, pero en su lugar contiene bytecode. Con los argumentos correctos, puede incluir otros archivos, módulos, etc. en el archivo de resultados. Lo utilicé con éxito en un proyecto. ¡El programa resultante se ejecutó en OS X, Linux y Windows sin ningún problema!

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

+0

Parece muy prometedor, lo echaré un vistazo. –

Cuestiones relacionadas