¿Cuál es la diferencia entre __init__.py y __main__.py?

2 minutos de lectura

avatar de usuario de buhtz
buhtz

Sé de estas dos preguntas sobre __init__.py y __main__.py:

¿Para qué sirve __init__.py?

¿Qué es __main__.py?

Pero realmente no entiendo la diferencia entre ellos. O podría decir que no entiendo cómo interactúan juntos.

  • Las respuestas a las dos preguntas que vinculaste son completamente diferentes. ¿Cuál es tu punto de confusión?

    – Alquimista de dos bits

    9 de julio de 2015 a las 20:48

Avatar de usuario de Terry Jan Reedy
Terry Jan Reedy

__init__.py se ejecuta cuando usted importar un paquete en un programa Python en ejecución. Por ejemplo, import idlelib dentro de un programa, se ejecuta idlelib/__init__.py, que no hace nada ya que su único propósito es marcar el directorio idlelib como un paquete. Por otro lado, tkinter/__init__.py contiene la mayor parte del código tkinter y define todas las clases de widgets.

__principal__.py se ejecuta como ‘__main__’ cuando correr un paquete como programa principal. Por ejemplo, python -m idlelib en una línea de comando se ejecuta idlelib/__main__.py, que inicia Inactivo. Similarmente, python -m tkinter carreras tkinter/__main__.pyque tiene esta línea:

from . import _test as main

En este contexto, . es tkinterentonces importando . importaciones tkinterla cual recorre tkinter/__init__.py. _test es una función definida dentro de ese archivo. Entonces llamando main() (siguiente línea) tiene el mismo efecto que ejecutar python -m tkinter.__init__ en la línea de comando.

  • Por que tkinter tener mucho código en el __init__.py archivo mientras idlelib no tienes codigo ahi? ¿Hay alguna razón por la que a veces le gustaría tener código en __init__.py pero otras veces no?

    – Hola Adios

    11 de agosto de 2017 a las 10:59

  • Código en package/__init__.py hacer el import package realmente hacer algo. Antes de 3.0, Tkinter era un módulo, no un paquete. En 3.0, el código en Tkinter.py fue puesto en tkinter/__init__.py, so the only change needed was importar tkinter` en lugar de import Tkinter.

    – Terry Jan Reedy

    13 de agosto de 2017 a las 22:52


  • @Terry Jan Reedy: ¿Podría explicar “Así que llamar a main() (siguiente línea) tiene el mismo efecto que ejecutar python -m tkinter.__init__ en la línea de comando”…? Gracias.

    – Aprendiz

    7 de mayo a las 20:02

  • @Hola Adios tkinter un paquete pero los desarrolladores querían import tkinter para dar acceso al conjunto de widgets pre-ttk. Pegando el código para esto en en eso fue la manera más fácil de lograr esto.

    – Terry Jan Reedy

    10 de mayo a las 1:14

__init__.pyentre otras cosas, etiqueta un directorio como un directorio de python y le permite establecer variables en un nivel de paquete amplio.

__main__.pyentre otras cosas, se ejecuta si intenta ejecutar un grupo comprimido de archivos python. __main__.py le permite ejecutar paquetes.

Ambas respuestas se obtuvieron de las respuestas que vinculó. ¿Hay algo más que no entendiste sobre estas cosas?

¿Ha sido útil esta solución?