Cómo depurar __main__.py

A veces estás escribiendo un módulo Python y quieres que se pueda ejecutar como un script, para lo cual le creas un fichero __main__.py en su directorio raíz.El problema de esto es que te obliga a ejecutarlo siempre como python -m nombremodulo, y muchas veces los depuradores no son capaces de entender eso.

¿Solución? Ejecutar directamente __main__.py. Solo que esto plantea otro problema: que entonces no puedes realizar importaciones relativas.

¿Solución real? Añade siempre este código al principio de tu __main__.py:

import os
import sys
from importlib import import_module

# Emular la ejecución como módulo si se ejecuta como script
if __name__ == '__main__' and __package__ is None:
    parent_dir = os.path.abspath(os.path.dirname(__file__))
    sys.path.append(os.path.dirname(parent_dir))
    __package__ = os.path.basename(parent_dir)
    import_module(__package__)

Con eso consigues que los siguientes dos comandos sean equivalentes. Usa el 2º para depurar:

$ python -m nombremodulo
$ python ./nombremodulo/__main__.py

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s