py2app excludes

:: python

Al generar una aplicación para Mac OS X con py2app, a menudo se generan ejecutables muy pesados, por ejemplo 20 MBs para una aplicación de línea de comandos (!).

Uno de los problemas es que py2app tiende a incluir muchos módulos de la librería estándar de Python que en realidad no hacen falta. Se pueden excluir específicamente incluyéndolos en la opción excludes que se pasa a la función setup en el archivo setup.py usado para generar la aplicación.

Con la lista siguiente, el peso baja de 22 MBs a 6 MBs. Probablemente se puede rebajar aún más.

# File: setup.py

from setuptools import setup

APP = ['path/main.py']
Plist = {}
DATA_FILES = []
OPTIONS = {'argv_emulation': True,
           #'iconfile': 'Icons/ConverterIcon.icns',
           'plist': Plist,
           'excludes': [
               'aetypes',
               'ast',
               'bz2',
               'calendar',
               'codecs',
               'collections',
               'ctypes',
               'distutils',
               'doctest',
               'email',
               'encodings',
               'functools',
               'gzip',
               'inspect',
               'itertools',
               'locale',
               'logging',
               'optparse',
               'pickle',
               'platform',
               'pprint',
               'random',
               're',
               'sets',
               'shutil',
               'socket',
               'ssl',
               'subprocess',
               'tarfile',
               'tempfile',
               'threading',
               'traceback',
               'types',
               'unittest',
               'urllib',
               'urllib2',
               'urlparse',
               'weakref',
               'xml',
               'zipfile',
           ]
           }

setup(
    app=APP,
    package_dir={'': 'src'}, # you may not need this
    data_files=DATA_FILES,
    version="0.1",
    description="<Your description>",
    author="<Your name>",
    author_email="<Your email>",
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

Compilar Cython

:: python

Compilar ficheros de Cython es más fácil usando la función cythonize dentro del setup.py de nuestro proyecto:

# File: setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(
      name = "My hello app",
      ext_modules = cythonize('fibonacci.pyx'), # accepts a glob pattern
)

Por ejemplo, el fichero a compilar es fibonacci.pyx, que contiene un ejemplo del tutorial de Cython:

# File: fibonacci.pyx

def fib(n):
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a + b

El resultado de compilar fibonacci.pyx es un fichero con código intermedio en C fibonacci.c y un fichero compilado fibonacci.so.

$ python setup.py build
running build
running build_ext
building 'fibonacci' extension
/usr/bin/clang ...snip... -o build/lib.macosx-10.8-x86_64-2.7/fibonacci.so

note

El compilador que se utiliza es el que sea por defecto del sistema en ese momento. Aún estoy investigando cómo seleccionar un compilador en concreto, o añadir librerías y flags.

El fichero .so puede usarse desde otros módulos de Python, o directamente desde la shell

>>> import fibonacci
>>> fibonacci.fib(5)
1 1 2 3

Infraestructura de lanzamientos locales

:: sysadmin

Este post describe cómo crear una infraestructura de lanzamientos locales, para compartir paquetes locales con otros desarrolladores del mismo equipo, basándose en Python y Macports. Esto presupone que los otros miembros del equipo usan todos Mac OS X, y que están interesados en usar paquetes de Python, claro.

Necesitaremos:

  • crear un paquete de Python con su correspondiente setup.py
  • tener un directorio releases servido por HTTP por el servidor Apache integrado en el sistema operativo.
  • tener un directorio ports servido por rsync.
  • configurar Macports para usar este nuevo repositorio.