¿Para qué es el __main__.py
archivo, qué tipo de código debo poner en él y cuándo debo tener uno?
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.
python -m program_dir
ypython program_dir
un poco diferente: este último nunca se ejecuta__init__.py
en el directorio (si hay uno).python3 program_dir
y funcionó__init__.py
.python3 dir
funciona__main__.py
pero no__init__.py
, mientras quepython3 -m dir
ejecuta ambos.__main__.py
cual se activó la importación de__init__.py
¿Para qué es el
__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: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 archivosdemo/__<init/main>__.py
con contenido entreEOF
s:(En un shell Posix / Bash, puede hacer lo anterior sin la
<< EOF
sy terminandoEOF
s ingresando Ctrl+ D, el carácter de fin de archivo, al final de cada comando cat)Y ahora:
Puede derivar esto de la documentación. La documentación dice:
Cremallera
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:
fuente
__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í:y el contenido de
__main__.py
wasEntonces, si fuéramos a correr
python test.zip world
, saldríamoshello world
.Entonces, el
__main__.py
archivo se ejecuta cuando se llama a python en un archivo zip.fuente
Se crea
__main__.py
enyourpackage
para que sea ejecutable como:fuente
-m
funciona si solo se puede acceder al programa como un módulo, de lo contrario podría usarpython <yourpackage>
NOTA: sin-m
opciónpackage
?python -m <yourproject>
no funciona,-m
es una opción redundante, peropython <yourpackage>
funciona bien.a
y asumir el scripta/b/c/__main__.py
...python -m b.c
se ejecutará desde el directorioa
y las importaciones del script principal serán relativas aa
. Peropython b/c
se ejecutará desde el alcance de importación de dirc
y, por lo tanto, cualquier importación como en el script principalimport b.d
fallará.Si su secuencia de comandos es un directorio o un archivo ZIP en lugar de un solo archivo de Python,
__main__.py
se ejecutará cuando la "secuencia de comandos" se pase como argumento al intérprete de Python.fuente