¿Por qué Python ejecuta mi módulo cuando lo importo y cómo lo detengo?

Resuelto Dasmowenator asked hace 13 años • 12 respuestas

Tengo un programa Python que estoy construyendo y que se puede ejecutar de dos maneras: la primera es llamar, python main.pylo que solicita al usuario información de manera amigable y luego ejecuta la entrada del usuario a través del programa. La otra forma es llamar a which pasará por alto toda la recopilación de entradas amigables y ejecutará la entrada de un archivo completo a través del programa de una sola vez.python batch.py -file-

El problema es que cuando lo ejecuto batch.py, importa algunas variables/métodos/etc main.py., y cuando ejecuta este código:

import main

en la primera línea del programa, inmediatamente se produce un error porque intenta ejecutar el código en formato main.py.

¿Cómo puedo evitar que Python ejecute el código contenido en el mainmódulo que estoy importando?

Dasmowenator avatar Jun 29 '11 23:06 Dasmowenator
Aceptado

Porque así es como funciona Python: palabras clave como classy nodef son declaraciones. En cambio, son declaraciones reales en vivo que se ejecutan. Si no se ejecutaran, su módulo estaría vacío.

El enfoque idiomático es:

# stuff to run always here such as class/def
def main():
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

Sin embargo, requiere control de fuente sobre el módulo que se está importando.

 avatar Jun 29 '2011 16:06

Debido a la forma en que funciona Python, es necesario que ejecute sus módulos cuando los importa.

Para evitar que el código del módulo se ejecute cuando se importa, pero solo cuando se ejecuta directamente, puedes protegerlo con esto if:

if __name__ == "__main__":
    # this won't be run when imported

Es posible que desee colocar este código en un main()método, de modo que pueda ejecutar el archivo directamente o importar el módulo y llamar al archivo main(). Por ejemplo, supongamos que esto está en el archivo foo.py.

def main():
    print "Hello World"

if __name__ == "__main__":
    main()

Este programa se puede ejecutar desde python foo.py, o desde otro script de Python:

import foo

...

foo.main()
Jeremy avatar Jun 29 '2011 16:06 Jeremy

Utilice el if __name__ == '__main__'modismo -- __name__es una variable especial cuyo valor es '__main__'si el módulo se ejecuta como un script y el nombre del módulo si se importa. Entonces harías algo como

# imports
# class/function definitions
if __name__ == '__main__':
    # code here will only run when you invoke 'python main.py'
Ismail Badawi avatar Jun 29 '2011 16:06 Ismail Badawi