Crear un ejecutable .exe en python con cx_Freeze

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

  1. Unknown dice:

    Y si mi aplicación tiene varios archivos como la compilo a exe

    1. PythonDiario dice:

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

  2. Sh0ck10 dice:

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

    1. PythonDiario dice:

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

  3. Unknown dice:

    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

    1. PythonDiario dice:

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

    2. PythonDiario dice:

      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

    3. Unknown dice:

      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

    4. SalvaMX dice:

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

  4. Anónimo dice:

    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.

  5. Josafat dice:

    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??

    1. PythonDiario dice:

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

      Saludos!!!

  6. cesar dice:

    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

    1. cesar dice:

      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

    2. PythonDiario dice:

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

  7. Unknown dice:

    Hola Diego.Estoy un poco desesperado, porque ya lo he intentado casi todo y no logro solucionar este problema, a ver si tu me puedes ayudar. Verás, estoy intentando crear un ejecutable para windows de un programa que tengo en python3,4. Hago todo lo que dices, pero al intentar python.exe setup.py build me sale el error: python.exe: can't open file setup.py. Errorn2 No such file or directory.

    1. PythonDiario dice:

      Hola Jose, me me alegro hallas resuelto tu inconveniente!!! Gracias por pasarte
      Saludos

  8. Unknown dice:

    Hola otra vez. Ya está solucionado. Gracias de todas formas. Un saludo.

  9. Unknown dice:

    Hola otra vez. Ya está solucionado. Gracias de todas formas. Un saludo.

  10. James dice:

    Hola, gracias por el tutorial. Realicé los mismos pasos, estoy usando python 3.4, descargué ña versión de cx_Freeze para python 3.4, pero me da el siguiente error ¨ImportError: DLL load failed: %1 no es una aplicación Win32 válida¨ Me puedes ayudar con este problema. Gracias de ante mano.

  11. Unknown dice:

    Saludos, Diego

    te agradezco un montón sin embargo el ejecutable corre y termina eficientemente pero no nos deja ver lo que se hizo busque ayuda en microsoft me dijeron que era problemas de compatibilidad. tengo windows 10 pro. Que tengo que hacer ahora amigo.

    Gracias por tu ayuda

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey