Google+ Seguidores

jueves, 25 de diciembre de 2014

Crear un ejecutable .exe en python con cx_Freeze

    16

En la entrada de hoy aprenderemos a crear un programa ejecutable en python (.exe) paso a paso con cx_Freeze. Imagínate que en algún momento quieres distribuir tu programa o enviárselo a un amigo: para ejecutar el programa, los destinatarios tendrían que tener instalado python, con su misma versión y si ejecutamos módulos de terceros, también tendrían que tenerlos.

Existen varias maneras de crear archivos ejecutables en python. Nosotros utilizaremos cx_Freeze.


Detalle de las pruebas


Las pruebas se realizaron el: 23/12/2014
Sistema Operativo: Windows XP /32
Versión de python: 2.7
Funcionalidad: al ejecutar el programa se envía automáticamente un correo electrónico
En la prueba solo se importa un módulo (smtplib)
No se utilizaron módulos de terceros

También puedes ver la segunda parte de este artículo (con más ejemplos y utilzando más de un archivo) aquí: Ejecutables en Python segunda parte

Instalar cx_Freeze


Para instalar cx_Freeze en Windows, lo primero que haremos será descargar el instalador desde su página:
https://pypi.python.org/pypi?:action=display&name=cx_Freeze&version=4.3.3#downloads

Descargar cx_Freeze
Descargar cx_Freeze

En mi caso elegí la opción: cx_Freeze-4.3.3.win32-py2.7.exe(md5)
Cuando descargamos el ejecutable, lo instalamos como un programa cualquiera (siguiente, siguiente....)

Crear el ejecutable paso a paso


Lo que hará nuestro script será enviar un correo electrónico a una dirección ya definida. Para eso, tenemos un archivo "correo.py" (en su caso será el archivo que quieran convertir a ejecutable) que contiene el código para el envío de correo:

Enviar correo con python
Enviar correo con python

Crearemos otro archivo que llamaremos "setup.py" y que tendrá el siguiente código:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from cx_Freeze import setup, Executable

setup(
 name="Correo",
 version="0.1",
 descriptiom="Enviar Correo",
 executables = [Executable("correo.py")],
 )

cx_Freeze
Creando el archivo setup.py

En name irá el nombre de nuestra aplicación, luego su versión, descripción y por último, en executables irá el nombre de nuestro archivo python, en nuestro caso "correo.py".

Ahora que ya tenemos los dos archivos.py necesarios, crearemos el archivo ejecutable. En caso de tener configurada la variable de entorno (Path - c:\python27\) para poder ejecutar python desde cualquier directorio, obviar los siguientes pasos y crear su ejecutable en el directorio que deseen.
Para los que no tengan configurada la variable de entorno, copiaremos los dos archivos (correo.py y setup.py) en la carpeta: c:\python27 (o la versión que tengan de python):

Carpeta de instalación python
La carpeta donde está instalado python

Luego abrimos el terminal de Windows (cmd) y nos dirigimos a esta misma carpeta (c:\python27\) de la siguiente manera:

Simbolo del sistema Windows
Simbolo del sistema Windows
Lo primero que hicimos fue ir al directorio Raíz con la orden: cd \, luego con el comando dir vimos los archivos y carpetas que contiene el directorio Raíz (C:\>), y luego nos cambiamos al directorio Python27 (ustedes eligen según su versión) con con la orden: cd Python27

Una ves en el directorio, escribimos la siguiente orden: python.exe setup.py build
Si todo sale bien, lo que hará esta orden será crear una carpeta build en el directorio c:\python27 que contendrá nuestro archivo ejecutable:

Creando nuestro ejecutable
Creando nuestro ejecutable
Carpeta build
La carpeta build contiene nuestro ejecutable

Dentro de build se crea una carpeta con el nombre: exe.win32-2.7, nosotros le cambiaremos el nombre por Correo y la cambiaremos de lugar (En el escritorio):

Cambiando de directorio
Moviendo la carpeta al escritorio

Dentro de la carpeta Correo, encontraremos nuestro archivo ejecutable: correo.exe

archivo.exe
correo.exe

Crear un instalador con winrar


Me imagino que si utilizas Windows ya debes conocer Winrar (es un potente compresor de archivos para windows). Una de las tantas funcionalidades que tiene es crear archivos auto extraíbles.

Archivo auto-extraible
Winrar para Windows

¿Para que nos sirve?
Ya vimos que al crear nuestro archivo ejecutable, se crear una carpeta que contiene, aparte de nuestro archivo, otros archivos que hacen que nuestro ejecutable funcione. Si queremos enviar nuestro programa por correo, llevar en un pendrive o distribuir en una web, será más fácil crear un archivo auto-extraíble que contenga la carpeta que hemos creado con anterioridad.

Para eso, lo primero es descargar Winrar: https://www.winrar.es/descargas (su instalación es súper fácil).
Una ves instalado, damos clic con el botón secundario del mouse en la carpeta que contiene nuestro ejecutable y elegimos la opción: añadir al archivo:

Añadir al archivo - Winrar
Añadir al archivo


Se abrirá una ventana como la siguiente, donde tildaremos la opción: crear un archivo auto-extraíble (también puede aparecer como crear un archivo SFX):

Marcar opción auto-extraíble
Marcar opción auto-extraíble


Existen montones de opciones en winrar para darle funcionalidad a nuestro archivo auto-extraíble, por ejemplo: poner un icono al auto-extraíble, colocar una ruta de extracción, ejecutar un archivo específico al extraer, y mucho más. Nosotros solo nos limitaremos a crear el auto-extraíble en el escritorio, para eso le damos al botón aceptar de la imagen anterior. Una ves hecho esto, se creará un archivo como el de la imagen siguiente. Si lo ejecutamos extraerá la carpeta que contiene nuestro programa ejecutable python en el escritorio:

Archivo auto-exrtraíble
Archivo auto-extraíble

Ahora ya podemos distribuir nuestros programas realizados en python sin que el destinatario tenga la necesidad de tener instalado Python y Winarar. Como dije anteriormente, las pruebas que he realizado han funcionado correctamente en Windows XP y Winodows 7, sin embargo, no puedo asegurar que todos los programas funcionen 100 % bien, pero cualquier duda o problema dejarlo en los comentarios de esta entrada.

Cualquier aporte es bienvenido para completar la entrada. 

Saludos, Diego...

16 comentarios:
Write comentarios
  1. Y si mi aplicación tiene varios archivos como la compilo a exe

    ResponderEliminar
    Respuestas
    1. Hola Alberto, por ahora no he probado utilizando varios archivos. Pero investigo un poco y luego te comento. Saludos

      Eliminar
  2. Yo tambien tengo ese problema, como crearlo si tengo varios archivos... ya lo resolvieron?... por cierto excelente aportacion muchas gracias :D

    ResponderEliminar
    Respuestas
    1. Hola Sh0ck10, en estos días averiguo sobre el tema y te comento. Saludos y gracias por visitar el blog...

      Eliminar
  3. hola diego ya realice una prueba y con las librerias QT4 pero al obtener el exe al ejecutarlo solo se abre y se cierra rapidamente falta algun parametro o dede la programacion, gracias

    ResponderEliminar
    Respuestas
    1. Hola Celestino, hoy o mañana hago algunas pruebas y te comento. Saludos

      Eliminar
    2. Celestino, fijate si el siguiente ejemplo puede ayudarte (esta sacado de los ejemplos de cx_Freeze): https://bitbucket.org/anthony_tuininga/cx_freeze/src/1282b6b6ee637738210113dd88c3c198d475340f/cx_Freeze/samples/PyQt4/?at=default

      Saludos

      Eliminar
    3. Saludos Diego, asi es ya verifique la pagina y faltaba la plataforma, que por cierto revisando en la carpeta donde se encuentra el ejecutable y demas archivos dll, hay un zip con nombre library donde hay unos archivos compilados pyc y estan los modulos que hice por ejemplo saludo_main_pyc, hay manera de protegerlos creo que hay algo parecido a import Hook pero no entiendo como agregar estos modulos, esta referente a trabajar con C, te paso el link https://github.com/neurogeek/python-crypt-import-hooks creo que funcionaria como implementarlo, te agradesco por tu aporte gracias

      Eliminar
    4. Celestino Escudero, si te interesa ya logre hacer un ejecutable del ejercicio
      http://www.pythondiario.com/2015/04/generar-un-pdf-partir-de-un-sencillo.html
      utilizando cx_Freeze.

      Eliminar
  4. Hola tengo un problema en ejecutar .exe compilados con cx_freeze a partir de un .py y ejecutarlos en distintas versiones de Windows, estos no tienen instalado python......Puede que el error de se por que les hace falta la instalación de python y la librerías que utilizo?

    El .exe esta compilado en windows, pero cuando lo ejecuto en otra maquina virtual con la misma versión me dice DLL load failed: No se puede encontrar el modulo especificado y me hace referencia a kinterbasdb ERROR

    ImportError: DLL load failed: This application has failed to start because the a

    pplication configuration is incorrect. Reinstalling the application may fix this

    problem.

    ResponderEliminar
  5. Hola ... una consulta, cuando hice los pasos que indicaste en el blog, resulto tal cual, pero se abre una ventana negra al ejecutar el .exe creado, como si corriera el mismo archivo py, ahi alguna forma de evitar eso??

    ResponderEliminar
    Respuestas
    1. Hola Josafat, gracias por visitar el blog. Fijate en esta otra entrada: http://www.pythondiario.com/2015/06/crear-un-ejecutable-exe-en-python-con_3.html

      Saludos!!!

      Eliminar
  6. hola amigo... excelente tuto, me ha servido mucho...

    he logrado convertir de .py a .exe con exito, incluso con la linea base=win32GUI para no mostrar la linea de comandos de windows...

    tengo el siguiente problema... todo marcha bien con la conversion que te he indicado, mi programa muestra la medicion de sensores, el software no presenta ningun tipo de error, solo que a los 60 segundos de no utilizarse, las medidas dadas por los display se congelan, solo se actualizan al hacer clic en algun boton o mover algo.... ese problema sucede 60 segundos después de la ultima actividad, sea cliclear un boton o cualquier otra cosa...

    PD: esto no ocurre si uso base=None...

    quiza con este ejemplo me pueda dar a entender..
    supongamos que he elavorado un reloj digital, tiene un boton que cambia los colores del display, entonces la actualizacion del display se parara luego de 60 segundo de su ultimo uso, es decir luego de haber presionado el boton y no utilizarlo mas

    ResponderEliminar
    Respuestas
    1. amigo ya solucioné... no era la conversión.. solo tenia un problema en mi código .py ... estaba mandando demasiados print a la consola de python... solo desactive en su totalidad y asunto arreglado..

      realicé una prueba del programa alrededor de 30min y funciona corectamente... gracias por tus tutos... éxitos

      Eliminar
    2. Genial, te iba a pedir que revisaras tu código porque no me daba cuenta del problema!!!!
      Gracias por visitar el blog!!!

      Eliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.