¿Para qué es el __main__.py
archivo, qué tipo de código debo poner en él y cuándo debo tener uno?
¿Para qué es el __main__.py
archivo, qué tipo de código debo poner en él y cuándo debo tener uno?
Respuestas:
A menudo, un programa Python se ejecuta nombrando un archivo .py en la línea de comando:
$ python my_program.py
También puede crear un directorio o archivo zip lleno de código e incluir a __main__.py
. Luego puede simplemente nombrar el directorio o el archivo zip en la línea de comando, y se ejecuta __main__.py
automáticamente:
$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program
Tendrá que decidir por sí mismo si su aplicación podría beneficiarse de una ejecución como esta.
Tenga en cuenta que un __main__
módulo generalmente no proviene de un __main__.py
archivo. Puede, pero generalmente no lo hace. Cuando ejecuta un script como python my_program.py
, el script se ejecutará como el __main__
módulo en lugar del my_program
módulo. Esto también sucede para los módulos que se ejecutan como python -m my_module
, o de varias otras maneras.
Si vio el nombre __main__
en un mensaje de error, eso no significa necesariamente que deba buscar un __main__.py
archivo.
python3 program_dir
y funcionó __init__.py
.
python3 dir
funciona __main__.py
pero no __init__.py
, mientras que python3 -m dir
ejecuta ambos.
__main__.py
cual se activó la importación de__init__.py
__main__.py
archivo?Al crear un módulo Python, es común hacer que el módulo ejecute alguna funcionalidad (generalmente contenida en una main
función) cuando se ejecuta como el punto de entrada del programa. Esto normalmente se hace con el siguiente idioma común colocado en la parte inferior de la mayoría de los archivos de Python:
if __name__ == '__main__':
# execute only if run as the entry point into the program
main()
Puede obtener la misma semántica para un paquete Python con __main__.py
. Este es un indicador de shell de Linux $
, si no tiene Bash (u otro shell de Posix) en Windows, simplemente cree estos archivos demo/__<init/main>__.py
con contenido entre EOF
s:
$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF
(En un shell Posix / Bash, puede hacer lo anterior sin la << EOF
sy terminando EOF
s ingresando Ctrl+ D, el carácter de fin de archivo, al final de cada comando cat)
Y ahora:
$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed
Puede derivar esto de la documentación. La documentación dice:
__main__
- Entorno de script de nivel superior
'__main__'
es el nombre del ámbito en el que se ejecuta el código de nivel superior. Un módulo__name__
se establece igual que'__main__'
cuando se lee desde una entrada estándar, un script o desde una solicitud interactiva.Un módulo puede descubrir si se está ejecutando o no en el ámbito principal comprobando el suyo propio
__name__
, lo que permite un modismo común para ejecutar código condicionalmente en un módulo cuando se ejecuta como un script o con,python -m
pero no cuando se importa:if __name__ == '__main__': # execute only if run as a script main()
Para un paquete, se puede lograr el mismo efecto al incluir un
__main__.py
módulo, cuyo contenido se ejecutará cuando se ejecute el módulo-m
.
También puede empaquetar esto en un solo archivo y ejecutarlo desde la línea de comando de esta manera, pero tenga en cuenta que los paquetes comprimidos no pueden ejecutar subpaquetes o submódulos como punto de entrada:
$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed
__main__.py
se usa para programas de python en archivos zip. El __main__.py
archivo se ejecutará cuando se ejecute el archivo zip. Por ejemplo, si el archivo zip era así:
test.zip
__main__.py
y el contenido de __main__.py
was
import sys
print "hello %s" % sys.argv[1]
Entonces, si fuéramos a correr python test.zip world
, saldríamos hello world
.
Entonces, el __main__.py
archivo se ejecuta cuando se llama a python en un archivo zip.
Se crea __main__.py
en yourpackage
para que sea ejecutable como:
$ python -m yourpackage
-m
funciona si solo se puede acceder al programa como un módulo, de lo contrario podría usar python <yourpackage>
NOTA: sin -m
opción
package
?
python -m <yourproject>
no funciona, -m
es una opción redundante, pero python <yourpackage>
funciona bien.
a
y asumir el script a/b/c/__main__.py
... python -m b.c
se ejecutará desde el directorio a
y las importaciones del script principal serán relativas a a
. Pero python b/c
se ejecutará desde el alcance de importación de dir c
y, por lo tanto, cualquier importación como en el script principal import b.d
fallará.
python -m program_dir
ypython program_dir
un poco diferente: este último nunca se ejecuta__init__.py
en el directorio (si hay uno).