Crear ejecutable («.exe») de un programa Python

Programar en Python en nuestro GNU/Linux es una belleza. Pero cuando también nos toca soportar dicho Software en plataformas MS Windows lo vemos más complicado. O tal vez pueda darse el caso de que el profesor solicite entregar la tarea programada en un «.exe» y nos de la libertad de escoger el lenguaje de programación que nosotros queramos (cualquier relación con la realidad es pura coincidencia).

Pero por dicha podemos hacer un freeze de nuestros scripts en Python, es decir, empaquetar en un «.exe» nuestro programa, las bibliotecas Python que utiliza y el mismísimo intérprete Python con lo que podremos distribuir el Software y ejecutarlo sin la necesidad de tener que descargar Python para Windows primero.

Para ello necesitamos tener un MS Windows en el cual realizaremos lo siguiente:

  1. Instalar y configurar Python.
  2. Instalar como administrador Py2Exe.
  3. Crear script de distribución setup.py
  4. Llamar al script de distribución con el parámetro py2exe

Instalar y configurar Python

Es necesario descargar Python para Windows desde la página oficial.

Es importante descargarse la última versión de la rama 2.X ya que py2exe no está disponible para Python 3 todavía (y no creo que pronto). En mi caso para la máquina virtual (mi GNU/Linux es de 64bits, la máquina virtual de 32) descargué la versión Python 2.7.3 para 32bits, es decir Windows x86 MSI Installer.

Una vez descargado se ejecuta e instala para todos los usuarios. Recomiendo cambiar la ruta de C:\Python2.7 a C:\Program Files\Python2.7 por una cuestión de orden.

Una vez instalado se procede a configurar el PATH de Windows para que encuentre el ejecutable de Python, para así no tener que escribir toda la ruta del ejecutable cuando queramos correr un script. Para ello vamos al editor de variables de entorno de Windows. En Windows 7 es:

Inicio -> Click derecho en My Computer -> Propiedades -> Advanced System Settings -> Pestaña Advanced -> Botón Environment Variables

Editamos la que dice Path en el cuadro de variables de entorno y adjuntamos al final del string la ruta de la carpeta de instalación de Python, separándola con un punto y coma ; , es decir:

[lo que habia escrito];[ruta de instalacion python]

En mi caso:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Python2.7

Ok, ok, ok. Ahora abrimos la PowerShell (que de Power no tiene nada si la comparas con Bash) y escribimos el comando python y debería iniciar el interprete. Para abrir la PowerShell ingresa al menú de inicio y busca PowerShell. Listo.

Instalar como administrador Py2Exe

Py2Exe es el paquete que hará la magia de crearnos nuestro «.exe». Descargamos la última versión desde la página oficial para nuestra versión de Python y arquitectura: descargar.

En mi caso, es py2exe-0.6.9.win32-py2.7.exe.

Un vez descargado instalamos el paquete como administrador: click derecho - ejecutar como administrador. Si no lo ejecutamos como administrador el instalador se quedará congelado y no avanzará. Listo.

Crear script de distribución setup.py

Creamos un archivo Python llamado setup.py encargado de la distribución del Software. El estricto mínimo funcional sería:

from distutils.core import setup
import py2exe

setup(console=['nombrearchivo.py'])

Ahora bien un ejemplo más completo sería:

# -*- coding: utf-8 -*-

import sys
from distutils.core import setup

kwargs = {}
if 'py2exe' in sys.argv:
    import py2exe
    kwargs = {
        'console' : [{
            'script'         : 'nombrescript.py',
            'description'    : 'Descripcion del programa.',
            'icon_resources' : [(0, 'icon.ico')]
            }],
        'zipfile' : None,
        'options' : { 'py2exe' : {
            'dll_excludes'   : ['w9xpopen.exe'],
            'bundle_files'   : 1,
            'compressed'     : True,
            'optimize'       : 2
            }},
         }

setup(
    name='nombreproyecto',
    author='Nombre del autor',
    author_email='autor@correo.com',
    **kwargs)

Lo bueno de éste último es que creará realmente un único archivo .exe. Y la verdad se puede volver tan complejo como ustedes quieran. Toda la documentación de cada uno de éstos elementos pueden encontrarlo en la wiki de Py2Exe.

Llamar al script de distribución con el parámetro py2exe

Desde el PowerShell:

cd C:\Carpeta De Proyecto\

python setup.py py2exe

Y luego encontrarán el .exe en la carpeta dist/.

Saludos

Etiquetado ,

34 pensamientos en “Crear ejecutable («.exe») de un programa Python

  1. mdcreativos dice:

    Hola, excelente tu tutorial

    Estoy haciendo un proyecto tipo consola, donde coloco las cosas tal como explicas y el proceso de generación del exe es bastante completo, en el archivo shared.zip van todas las librerias que uso:

    kinterbasdb
    reportlab
    win32

    entre otras que son especificas por el tipo de asunto que hace el programa (imprime unos tickets a pdf después de recibir un mensaje cada vez que se incluye un registro de cobro en una base de datos firebird.)

    El asunto es que cuando lo voy a ejecutar obtengo:

    Traceback (most recent call last):
    File «impretik.py», line 1, in
    File «zipextimporter.pyo», line 82, in load_module
    File «reportlab\platypus\__init__.pyo», line 7, in
    File «zipextimporter.pyo», line 82, in load_module
    File «reportlab\platypus\flowables.pyo», line 34, in
    File «zipextimporter.pyo», line 82, in load_module
    File «reportlab\pdfbase\pdfmetrics.pyo», line 23, in
    File «zipextimporter.pyo», line 82, in load_module
    File «reportlab\pdfbase\_fontdata.pyo», line 158, in
    ImportError: No module named _fontdata_enc_winansi

    pero cuando reviso dentro de la carpeta de reportlab en el zip todo esta ahí.???!!??

    • cjenkins dice:

      -Hasta ahora veo este comentario- Seguramente te hace falta incluir algunos DLLS, posiblemente del win32. Muchas bibliotecas Python son en realidad wrappers, bindings o capas de conexión entre Python y una biblioteca escrita en otro lenguaje de programación (C, C++). Revisa el link http://www.py2exe.org/index.cgi/WorkingWithVariousPackagesAndModules . Prueba desactivando la característica de comprimir las bibliotecas, y cambiando los parámetros de optimización: no suelen llevarse bien como muchas bibliotecas (en mi caso fue con GTK). Finalmente recuerda probar el ejecutable en una máquina limpia sin entorno de desarrollo para saber que incluiste todos los elementos requeridos (y SOLO los elementos requeridos, fíjate en mi archivo setup.py los excludes del sistema).

    • cjenkins dice:

      También revisa este link, es exactamente tu problema: http://stackoverflow.com/questions/6786473/im

      • HB dice:

        hola amigo, ya q estas instruyendo y aportando tus conocimientos ayudame y explicame como hago para creear mi setup.exe en lenguaje c con GTK, porq lo creo con este programa inno setup compiler y si chevere pero al ejecutarlo del escritorio ya creado el supuesto setup.exe m sigue saliendo la consola y el entorno grafico que yo cree. Como hago, que hay q hacer alli para q no salga mas esa vendita consola ?

  2. juan pablo dice:

    perdon por revivir este tema, pero instale todo y me dice «no commands supplied» cuando pruebo con cualquiera de las dos opciones quedas.

    tengo win864 bits pero python 32bits no creo que afecte pero bueno… aviso.
    estoy usando python 2.7 y la version que baje de py2exe tmb es de 32… alguna idea?

    • cjenkins dice:

      Tendrías que ser más específico a que no te funciona. Si problema es ejecutando el comando de construcción, me suena a ésto:

      http://stackoverflow.com/questions/10937798/when-i-run-a-very-simple-py2exe-test-it-gives-me-errors

      • jose dice:

        me pòdria mirar esto aver el porke o me funciona

        try:
        realm=»realm%d.c%d.castle.wonderhill.com» % (realm_number, c)
        params=»/api/challenges/63/leaderboard/dragon%%5Fheart=%s&timestamp=%d&version=overarch&%%5Fsession%%5Fid=%s&user%%5Fid=%d&%%5Bplayer%%5D%%5Bmight%%5D=%s&%%5Fmethod=put» % (dragon_heart, int(time.time()), session_id, user_id,might)
        url=»http://%s/api/player.json» % (realm)
        cadena= «Draoumculiasis» + params + «LandCrocodile» + url + «Bevar-Asp»
        cadenau=cadena.encode(‘utf8’)
        m=hashlib.sha1(cadenau)
        xs3=m.hexdigest()
        headers= { ‘Host’: realm , ‘Connection’: ‘keep-alive’, ‘Content-Length’: len(params), ‘Origin’: ‘http://castlemania-production.s3.amazonaws.com’, ‘x-s3-aws’: xs3, ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11’, ‘content-type’: ‘application/x-www-form-urlencoded’, ‘Accept’: ‘*/*’, ‘Accept-score»Accept-null’: ‘gzip,deflate,sdch’, ‘Accept-Language’: ‘es-ES,es;q=0.8’, ‘Accept-Charset’: ‘ISO-8859-1,utf-8;q=0.7,*;q=0.3’, ‘DNT’: 1, ‘Cookie’: cookie }
        conn=http.client.HTTPConnection(realm,80)
        conn.request(«POST»,url,params, headers)
        time.sleep(0.5)

        except HTTPError as e:
        if e.code == 404:
        pass
        else:
        print(e.code)
        except URLError as e:
        pass
        exit

      • cjenkins dice:

        discpa per n ṕued lerr s cod. Ni quiero.

  3. Chikirol dice:

    Hola chicos yo realice todos los pasos exactamente como me lo indica el tutorial y funciona de maravilla solo que yo lo trabaje con win64 ahora quiero ejecutarlo en un equipo que es win32 y no me funciona el ejecutable me podrian ayudar a buscar una liberia que sea compatible con win32 ya que creo el motivo es por que mi equipo es de win64 bits o cual sera la solucion.
    Gracias. saludos.

    • cjenkins dice:

      Los ejecutables creados en sistemas de 64bits no funcionan en sistemas de 32bits. Sin embargo en el caso de Windows los ejecutables de 32bits si funcionan en sistemas de 64bits.

      Tienes varias opciones:

      1) Volver a hacer todo el procedimiento de crear el ejecutable en un sistema de 32bits (Python 32bits, todo 32bits), y tener dos versiones, la de 64bits y la de 32bits.
      2) Crear una versión de 32bits y que todos usen esa.

      Para crear la versión de 32bits puedes montar una máquina virtual con un Windows 32bits en tu computadora con sistema de 64bits y crearlo ahí.

      Saludos

  4. Davidson dice:

    Hola, tengo un pequeño problema. Yo hice un programa en python, tiene varios módulos: Fmain.py, new1.py, new2.py y new3.py. Fmain es el módulo principal. Cómo hago para crear el ejecutable con py2exe, cómo incluir todos los módulos? Es un programa con interfaces en TKinter. Tengo windows 32 bits. Gracias.

  5. emiliano dice:

    Buenas, esta muy bueno el articulo… pero te tengo que comentar que a mi no me funciono y me gustaría ver si me podes dar una mano.
    Yo cree un programa que en esencia realiza el código de cesar a partir de un string que solicita que ingreses… este es almacenado en una variable. luego te pide que digas si lo queres cifrar y descifrar.
    el programa funciona bien mientras lo ejecuto dentro del shell de python, o por ejemplo el pyscripter.
    pero al hacer el ejecutable, me aparece fugazmente el cmd y se va… o sea nunca me pide que ingrese nada….

    por favor si me podes dar una mano.

    Saludos

    • cjenkins dice:

      Si es un programa de terminal, debes lanzarlo desde la terminal, no desde la GUI con doble click. Entra al command prompt y ejecuta el programa, a ver que te sale.

      Saludos

      • emiliano dice:

        Buenas gracias por responder… te comento que lo lance de las dos maneras, o sea con doble click y desde el prompt. Pero aparentemente no hace nada… estando el command en ejecucion. c:cesar_code.py.exe enter y por una fraccion de segundo trae otra pantalla negra que no llego a ver que dice….
        PD tambien probe con c:start cesar_code.exe

      • emiliano dice:

        a me olvidaba… tambien me sale esto…
        Make sure you have the license if you distribute any of them, and
        make sure you don’t distribute files belonging to the operating system.

        USER32.dll – C:\Windows\system32\USER32.dll
        SHELL32.dll – C:\Windows\system32\SHELL32.dll
        ADVAPI32.dll – C:\Windows\system32\ADVAPI32.dll
        WS2_32.dll – C:\Windows\system32\WS2_32.dll
        GDI32.dll – C:\Windows\system32\GDI32.dll
        KERNEL32.dll – C:\Windows\system32\KERNEL32.dll
        PD tambien probe con c:start cesar_code.exe

  6. LUIS dice:

    Hola, siguiendo todos los comentarios, ni tan siquiera un programa como es el cxfreeze de ubuntu se ejecuta desde la terminal sin dar problemas en el mismo ubuntu y ademas encargado de facilitarnos esta gran complicacion de la portabilidad( me dice que especifique el script y los modulos). ¿podia existir algun programa que ayude a la portabilidad de ejecutables entre sistemas operativos SIN DAR TANTOS ERRORES Y FALLOS?

  7. Luis dice:

    Una pregunta, ¿esto quiere decir que con esta herramienta se convierte en codigo maquina al igual que lo que se hace con programas hechos en C? espero sus respuestas amigos, gracias.

    • LUIS dice:

      Hola Luis. Como yo lo entiendo es que este tipo de programas o aplicaciones, lo que hace es, una vez construido un programa y listo para utilizar, poderlo ejecutar en cualquier sistema operativo, distinto al cual se ha construido. En este caso en concreto, si el programa se ha construido en un sistema operativo Linux, que se pueda ejecutar en Windows. Creo que la mision es esa.
      Pero yo tengo una duda: Esta aplicacion llamada Py2exe, ¿se utiliza de Linux a Windows o de Windows a Linux?

      • cjenkins dice:

        Falso. Todo lo que dijiste está errado. Te recomiendo releer el artículo e ir a la página de Py2Exe. Este programa permite empaquetar en un set de archivos el interprete de Python, las bibliotecas y tu código byte-compilado de forma que puedas distribuir en Windows (!) un sólo conjunto de archivos con un ejecutable de forma que sólo se requiera esos archivos para ser ejecutado.

    • cjenkins dice:

      No. Python es similar a Java, el código es byte-compilado. Es decir, se procesa el texto y se convierte en una versión capaz de ser intepretada. Luego, esa versión es la que es interpretada por el interprete. En otras palabras, el interprete de Python no interpreta los caracteres y el texto escrito en un archivo Python, lo que si hace es convertir ese texto es una versión ejecutable y luego el interprete lo interpreta y ejecuta.

      Copio:

      «Pero por dicha podemos hacer un freeze de nuestros scripts en Python, es decir, empaquetar en un “.exe” nuestro programa, las bibliotecas Python que utiliza y el mismísimo intérprete Python con lo que podremos distribuir el Software y ejecutarlo sin la necesidad de tener que descargar Python para Windows primero.»

      Osea, este programa lo que hace es poner todo en un archivo: interprete, versión byte-compilada de tu Software y las bibliotecas. etc.

  8. Luis dice:

    Solo sirve en Windows, ya que crea .exe, pero sique la duda si compila en codigo maquina, o solo crea un ejecutable.

    • LUIS dice:

      Yo diria que solo crea el ejecutable para q pueda correr en todos los sistemas operativos porque compilar ya lo haces con tu IDE, pero tecnicamente habria q preguntar al creador de esta aplicacion.
      Gracias por despejar mi duda. OTRA APLICACION DE LA QUE ME PUEDO OLVIDAR….Gracias Luis

      • cjenkins dice:

        «Yo diria que solo crea el ejecutable para q pueda correr en todos los sistemas operativos» … «Compilar ya lo hace tu IDE»… ok… sin ganas de ofender, pero yo seguiría estudiando si fuera vos. Creo que no estás al tanto de todas las tonterias que has dicho.

    • cjenkins dice:

      Creo que ya te respondí arriba. Sólo un detalle importante. Lo que sí está compilado a código máquina es el interprete de Python que instalaste en tu máquina (la implementación del lenguaje, el interprete, llamado Cpython). Py2Exe no compila CPython, pero copia la versión pre-compilada que tengas en tu sistema. De forma que si instalaste un interprete de 64bits, no funcionará en sistemas de 32. Sin embargo, si instalaste un interprete de 32, cuando distribuyas los archivos, éstos si funcionarán en sistemas de 64bits.

  9. LUIS dice:

    Pues es posible que haya dicho tonterias, aunque yo lo llamaria desconocimiento, ademas de que en la practica me baje Pi2exe y Freeze y realmente a mi no me funciono.
    Mi sistema operativo es Ubuntu 12.10, mi IDE es Geany y mi version Python descargadas son la 2.7 y la 3.3 aunque con la que estudio es con la 2.7.
    Disculpa por mis «tonterias» pero soy muy constante y tenaz e intento las cosas paso a paso muchas veces. Pero a veces tambien me desespero cuando no me salen.
    Si puedes guiarme a realizar un exe con este Python 2.7 y Ubuntu 12.10 te lo agradeceria.
    Gracias y disculpa

    • cjenkins dice:

      Y me pregunto yo, para que quieres hacer un .exe en Ubuntu? Ubuntu no usa .exe, eso sólo lo usa Windows. Py2Exe sólo funciona para Windows. Este es un tutorial sólo para Windows. Me parece genial que uses Ubuntu, pero este tutorial es para esas ocasiones que debas distribuir tu trabajo en Windows. Si te interesa distribuir Software en Ubuntu entonces debes investigar sobre empaquetamiento .deb, no .exe.

      • LUIS dice:

        Hola, ante todo muchas gracias por tu contestacion.
        Lo que yo quiero hacer es distribuir scripts y programas Python para Windows. Lo que busco es una solucion para que estos scripts o programas Python puedan ser ejecutados o utilizados en windows sin necesidad de que el usuario de windows deba molestarse en configurar la variable path de su windows ni el tener la obligacion de instalarse Python en su pc.
        Eso es exactamente lo que yo busco y mi desconocimiento.
        Gracias

  10. Rolando Velasquez dice:

    Hola Amigo, gracias por el tutorial. haber si puedes ayudarme en mi caso. Acabo de hacer un programa en Python, específicamente una calculadora (a modo de practica, ya que recién estoy aprendiendo), obviamente es un programa con interfaz grafica, con botones, labels, Entrys, etc. que tambien tiene su correspondiente icono, y las librerias con las que trabaje son: Tkinter, math, tkFileDialog y csv, la version de python es 2.7.6. para win7 32 bits.
    El problema es que al parecer el procedimiento que ofreces es para programas tipo consola (me parece, disculpa por la ignorancia), es que en mi caso no funciona. si genera un archivo *.exe, en la carpeta dist (tal como explicas) pero al abrirlo solo aparece una ventana negra por un instante y luego desaparece.
    Lo que quiero es distribuir mi programita a mis amigos para que lo corran en sus respectivas PCs sin tener que instalar Python. Espero que puedas ayudarme.
    Saludos.

  11. Carl dice:

    Hola soy nuevo en este lenguaje su tutorial es muy claro, vi las bondades de Python genere varios códigos para crear archivos .exe con py2exe me funciono bien, pero recientemente instale psycopg2 y a partir solo me permite interpretarlos, mi duda es que hice mal que ya solo puedo unterpretar archivos. El equipo que uso es Win 7 32 bits y estoy usando Python 2.7.
    Saludos

  12. samuel dice:

    Todo normal. solo que el programa no corre. Solamente una ventana DOS y al instante se va.

  13. hugo canul dice:

    Hola buen dia, mira yo tengo este problema cuando me compila el script no me amrca ningun error de hecho me genera el archivo en la carpeta dist, pero cuando ejecuto el exe incluso en la maquina donde desarrollo el proyecto me dice que hay un error y que windows debe depurar y no ejecuta nada

  14. milagros dabove dice:

    hola buenas tardes quisiera crear un .exe haciendo que cx-freeze sea compatible con windows, python 34 y estas librerias:numpy, pandas, pypyodbc, pyodbc, xlwings
    muchas gracias

Replica a Luis Cancelar la respuesta