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