Archivo de la etiqueta: Python

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

Anuncios
Etiquetado ,

Clone a MongoEngine object (Python MongoDB layer)

Now, imagine you have something like:

class Company(Document):
    name            = StringField(required=True)
    company_id      = StringField(required=True)
    phone           = StringField()

For some reason, you want to clone this object on the DB. That’s is, you want to create another exact object in the DB without the need to create another object manually an copy all it’s attributes. You can do it if you add the following method (a real hack, because MongoEngine doesn’t support cloning objects):

def clone(self):
        del self.__dict__['_id']
        del self.__dict__['_created']
        del self.__dict__['_changed_fields']
        self.id = ObjectId()

Note: If you have a SequenceField() you will need to delete it too so it can step up when you save the new object.

Don’t forget to:

from bson import ObjectId

So you can do:

obj = Company.objects(name='MyCompany')
obj.clone()
obj.name = 'MyOtherCompany'
obj.save()

Really useful, specially if your object has 8+ fields and one of more of it’s fields is a EmbeddedDocument.

Kind regards

Etiquetado , ,

Ordenar una lista de diccionarios basado en un criterio variable ordenado

Que que? xD

Ok, se tiene una lista de diccionarios Python, se quiere ordenar según un criterio ordenado de valores que puede tomar un determinada llave de un diccionario. Ash, no se como decirlo más fácil. Mejor un ejemplo:

Se tiene la siguiente lista de diccionarios:

[{'foo': FOO1}, {'foo': FOO2}, {'foo': FOO10}]

Y se tiene la siguiente lista de criterio de ordenación:

[FOO10, FOO2, FOO1]

Se espera que la lista resultante esté ordenada de la siguiente manera:

[{'foo': FOO10}, {'foo': FOO2}, {'foo': FOO1}]

Python es el mejor. Acá cómo hacerlo:

>>> to_sort = [{'foo': FOO1}, {'foo': FOO2}, {'foo': FOO10}]
>>> criteria = [FOO10, FOO2, FOO1]
>>> to_sort.sort(key=lambda x: criteria.index(x['foo']))
>>> to_sort
[{'foo': FOO10}, {'foo': FOO2}, {'foo': FOO1}]
Etiquetado , ,

Python: Retorno en bloque try-except-finally

Bueno saberlo:

En Python se puede tener un bloque try-except-finally, retornar en except y aún así el código finally es ejecutado. Genial!

>>> def function():
...     try:
...         raise Exception()
...     except:
...         return True
...     finally:
...         print 'Finally executed'
... 
>>> function()
Finally executed
True
Etiquetado ,