Friday, October 29, 2010

Como generar archivos .exe e instaladores para una aplicación python (y pygtk)

Como generar archivos .exe e instaladores para una aplicación python


Este documento describe los pasos necesarios para crear un archivo ejecutable
de una aplicación python y como generar un instalador y una versión portable
para dicha instalación.

Este documento asume que la aplicación se basa en GTK pero debería funcionar
con menores cambios en otros toolkits.

porque un instalador

  • se requiere instalar muchos componentes a mano por el usuario final para una sola aplicación
  • muchos instaladores pequeños
  • difíciles de encontrar
  • difícil encontrar las versiones exactas que funcionan en conjunto
  • requiere instalarlos en un orden definido
  • rezar
  • algunas veces incluso haciendo todo bien puede no funcionar
  • fácil de automatizar y documentar para replicar con cada nueva versión
  • liberar al usuario final de los problemas para poder usar la aplicación

componentes requeridos

  • python
  • todas las librerías utilizadas por la aplicación
  • py2exe
  • nsis
  • tiempo y suerte

orden de instalación

algunos instaladores son independientes de otros, pero para evitar posibles problemas recomiendo la instalación en el siguiente orden.

  • python
  • gtk-runtime
  • gtk2-themes
  • nsis
  • pygobject
  • pycairo
  • pygtk
  • pywin32
  • py2exe

tareas extra

  • setear la variable de entorno PATH para agregar el path a la instalación de python
  • probar la instalación con una pequeña aplicación gtk
>>> import gtk
>>> w = gtk.Window()
>>> l = gtk.Label("asd")
>>> w.add(l)
>>> w.show_all()
>>> gtk.main()

prueba con una aplicación de ejemplo

Cree un repositorio con una aplicación de ejemplo para probar los pasos, la aplicación esta disponible en github acá:

http://github.com/marianoguerra/PyGtkOnWindows

pasos

  • descargarla
  • descomprimirla
  • ejecutar python setup.py py2exe
  • copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist
  • copiar todos los archivos del directorio dll al directorio dist
  • borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)
  • crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0
  • dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:
    • gtk-theme-name = "MS-Windows"
    • podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc
  • right click en ejemplo.nsi y seleccionar "Compile NSIS Script"
  • right click en ejemplo-portable.nsi y seleccionar "Compile NSIS Script"
  • deberías tener el instalador y la versión portable disponibles
  • para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente

probar con una aplicación real

ahora para sentirlo mas real, creemos un instalador y una versión portable de
un programa real, en este caso, un proyecto personal llamado emesene 2
(http://www.emesene.org/).

pasos

  • descargarlo de http://github.com/emesene/emesene
  • descomprimirlo
  • copiar setup.py and ez_setup.py al directorio emesene
  • cd emesene
  • correr python setup.py py2exe
  • cd ..
  • copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist
  • copiar todos los archivos del directorio dll al directorio dist
  • borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)
  • crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0
  • dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:
    • gtk-theme-name = "MS-Windows"
    • podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc
  • right click en emesene.nsi y seleccionar "Compile NSIS Script"
  • right click en emesene-portable.nsi y seleccionar "Compile NSIS Script"
  • deberías tener el instalador y la versión portable disponibles
  • para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente

notas

11 comments:

Javier said...

No se encuentra el punto de entrada del procedimiento gdk_win32_begin_direct_draw_libgtk_only en la biblioteca de vinculos dinamicos libgdk-win32-2.0-0.dll

Javier said...

Solo falla al usar gtk-theme-name="MS-Windows" como tema...

Los demas si me funcionaron correctamente.

luismarianoguerra said...

@Javier: copiaste los directorios lib y share de la instalacion de gtk a dist?

saludos

Javier said...

si, como te mencione, solo falla con el tema MS-Windows..mm..raro xD

Genelyk said...

Hola, soy seguidor de su proyecto y quise dar una mano, pero me sale este error
File "C:\Python26\lib\site-packages\py2exe\mf.py", line 204, in find_head_pack
age
raise ImportError, "No module named " + qname
ImportError: No module named OpenSSL
cuando ejecuto
emesene/emesene> python setup.py py2exe
instale el openssl laversion para windows pero igual , no se si me podrias dar una mano
el primer ejemplo si me salio.

Genelyk said...

Hola, soy seguidor de su proyecto y quise dar una mano, pero me sale este error
File "C:\Python26\lib\site-packages\py2exe\mf.py", line 204, in find_head_pack
age
raise ImportError, "No module named " + qname
ImportError: No module named OpenSSL
cuando ejecuto
emesene/emesene> python setup.py py2exe
instale el openssl laversion para windows pero igual , no se si me podrias dar una mano
el primer ejemplo si me salio.

luismarianoguerra said...

parece que instalaste mal (o no instalaste) pyOpenSSL

Genelyk said...

ay no comprendo bien esto de los comentarios entro con mi cuenta de google y me manda al blogger -.-

Bueno si efectivamente era el pyopenssl
pero luego tenia un problema con el modulo de papyon
lei q deberia estar en la carpeta de emesene pero estaba vacia asi q lo baje de la net y lo pege ai
al compilar me faltaban 2 dll
LIBEAY
SSLEAY
las tuve q pegar en system32
ahora si compilo pero solo me conecta a la red DUMMY en el icono de configuracion en cuando elige msn y agrego no acepta :S
aqui esta el enlace de lo q compile
http://www.megaupload.com/?d=8QY3LSEQ

luismarianoguerra said...

Genelyk:

te recomiendo que instales git para windows y bajes el repositorio de emesene y despues hagas

git submodule init
git submodule update

eso te va a traer todas las dependencias

saludos

Genelyk said...

bueno instala git pero ahora me sale este error cuando quiero abrirlo.
No handlers could be found for logger "emesene.e3.common.DBus"
:\Archivos de programa\emesene2\.\Crypto\Hash\SHA.py:6: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
Traceback (most recent call last):
File "emesene.py", line 68, in
File "gui\__init__.pyo", line 20, in

File "gui\base\__init__.pyo", line 21, in

File "gui\base\Theme.pyo", line 22, in

File "gui\base\AdiumThemes.pyo", line 23, in

File "gui\base\AdiumTheme.pyo", line 22, in

ImportError: No module named calendar

luismarianoguerra said...

proba haciendo checkout de marianoguerra/emesene.git

eso lo arregle hace unos dias.

saludos

(hay una guia mas nueva en los ultimos posts)