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