¿Por qué Python ejecuta mi módulo cuando lo importo y cómo lo detengo?
Tengo un programa Python que estoy construyendo y que se puede ejecutar de dos maneras: la primera es llamar, python main.py
lo 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 main
módulo que estoy importando?
Porque así es como funciona Python: palabras clave como class
y 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.
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()
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'