¿Por qué Python está ejecutando mi módulo cuando lo importo, y cómo lo detengo?

Tengo un programa Python que estoy construyendo que se puede ejecutar en cualquiera de dos maneras: el primero es llamar python main.py que incita al usuario a la entrada de forma amistosa y luego ejecuta la entrada del usuario a través del programa. La otra manera es llamar python batch.py -file- que pasará sobre toda la reunión de entrada amigable y ejecutará todo el valor de entrada de un archivo a través del programa en una sola pasada.

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

import main

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

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

Pregunta hecha hace 12 años, 8 meses, 0 días - Por phpphoenix


11 Respuestas:

  • Porque así es como funciona Python - palabras clave como class y def son no declaraciones. En lugar de eso, son en vivo declaraciones que se ejecutan. Si no fueran ejecutados 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 fuentes sobre el módulo importado.

    Respondida el Jun 29, 2011 a las 16:19 - por bytebuster

    Votos positivos: 0 | Votos negativos: 0

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

    Para evitar que el código en el módulo se ejecute cuando se importa, pero sólo cuando se ejecuta directamente, puede guardarlo con esto if:

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

    Usted puede querer poner este código en un main() método, para que pueda ejecutar el archivo directamente, o importar el módulo y llamar al main(). Por ejemplo, asuma que esto está en el archivo foo.py.

    def main():
        print "Hello World"
    
    if __name__ == "__main__":
        main()
    

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

    import foo
    
    ...
    
    foo.main()
    

    Respondida el Jun 29, 2011 a las 16:25 - por syntaxsculptor

    Votos positivos: 0 | Votos negativos: 0

  • Usar el if __name__ == '__main__' idioma... __name__ es una variable especial cuyo valor es '__main__' si el módulo se está ejecutando como script, y el nombre del módulo si es importado. Así que harías algo como

    # imports
    # class/function definitions
    if __name__ == '__main__':
        # code here will only run when you invoke 'python main.py'
    

    Respondida el Jun 29, 2011 a las 16:35 - por pixelpioneerb898

    Votos positivos: 0 | Votos negativos: 0

  • Por desgracia, no lo haces. Eso es parte de cómo funciona la sintaxis de importación y es importante que lo haga - recordar def es en realidad algo ejecutado, si Python no ejecutara la importación, usted estaría, bien, atrapado sin funciones.

    Puesto que probablemente tiene acceso al archivo, sin embargo, puede ser capaz de mirar y ver qué causa el error. Puede ser posible modificar su entorno para evitar que el error ocurra.

    Respondida el Jun 29, 2011 a las 16:41 - por debugdynamob312

    Votos positivos: 0 | Votos negativos: 0

  • Ponga el código dentro de una función y no funcionará hasta que llame a la función. Usted debe tener una función principal en su main.py. con la declaración:

    if __name__ == '__main__':
      main()
    

    Entonces, si llamas python main.py el main() La función funcionará. Si importa main.pyNo lo hará. Además, probablemente deberías cambiar de nombre main.py a otra cosa por el bien de la claridad.

    Respondida el Jun 29, 2011 a las 16:49 - por devgeek

    Votos positivos: 0 | Votos negativos: 0

  • Había una propuesta de mejora de pitón PEP 299 cuyo objetivo era sustituir if __name__ == '__main__': idioma con def __main__:, pero fue rechazado. Todavía es una buena lectura para saber qué tener en cuenta al usar if __name__ = '__main__':.

    Respondida el Jun 29, 2011 a las 16:58 - por debugdynamo46a0

    Votos positivos: 0 | Votos negativos: 0

  • Puede escribir su "main.py" así:

    #!/usr/bin/env python
    
    __all__=["somevar", "do_something"]
    
    somevar=""
    
    def do_something():
        pass #blahblah
    
    if __name__=="__main__":
        do_something()
    

    Respondida el Jun 29, 2011 a las 17:08 - por compilerchieftain

    Votos positivos: 0 | Votos negativos: 0

  • Hice una prueba simple:

    #test.py

    x = 1
    print("1, has it been executed?")
    
    
    def t1():
         print("hello")
         print("2, has it been executed?")
    
    
    def t2():
         print("world")
         print("3, has it been executed?")
    
    
    def main():
         print("Hello World")
         print("4, has it been executed?")
    
    
    print("5, has it been executed?")
    print(x)
    
    # while True:
    # t2()
    
    if x == 1:
         print("6, has it been executed?")
    

    #test2.py

    import test
    

    Al ejecutar o ejecutar test2.py, el resultado de funcionamiento:

    1, has it been executed?
    
    5, has it been executed?
    
    1
    
    6, has it been executed?
    

    Conclusión: Cuando el módulo importado no añade if __name__=="__main__":, el módulo actual se ejecuta, El código en el módulo importado que no está en la función se ejecuta secuencialmente, y el código en la función no se ejecuta cuando no se llama.

    además:

    def main():
        # Put all your code you need to execute directly when this script run directly.
        pass
    
    if __name__ == '__main__':
        main() 
    else:
        # Put functions you need to be executed only whenever imported
    

    Respondida el Jun 29, 2011 a las 17:15 - por compilerhero

    Votos positivos: 0 | Votos negativos: 0

  • Un error menor que podría ocurrir (al menos me sucedió), especialmente al distribuir scripts/funciones de python que realizan un análisis completo, fue llamar a la función directamente al final de la función .py archivo. Las únicas cosas que un usuario necesitaba modificar eran los archivos de entrada y los parámetros. Hacerlo cuando usted importa, usted conseguirá que la función funcione inmediatamente. Para un comportamiento adecuado, simplemente necesita eliminar la llamada interna a la función y reservarla para el archivo de llamada real/función/porción de código

    Respondida el Jun 29, 2011 a las 17:23 - por devguru123

    Votos positivos: 0 | Votos negativos: 0

  • Cuando importas un módulo en Python, este se ejecuta inmediatamente a menos que tomes medidas para evitarlo. Para detener la ejecución automática del módulo cuando lo importas, puedes seguir estos pasos:

    • En tu módulo `main.py`, envuelve el código que deseas que se ejecute en una condición que verifique si el módulo está siendo ejecutado como un programa independiente o si está siendo importado por otro módulo. Por ejemplo:
    python
    if __name__ == "__main__":
        

    Coloca aquí el código que deseas que se ejecute al llamar directamente a main.py

    Al hacer esto, el código dentro del bloque if __name__ == "__main__": solo se ejecutará si ejecutas directamente el archivo main.py pero no si lo importas desde otro módulo.

    • Al importar el módulo `main` en tu archivo `batch.py`, puedes importarlo de la siguiente manera para evitar que se ejecute su contenido:
    python
    from main import 
    

    Al importar solo las variables o métodos necesarios en

    Respondida el Jun 30, 2011 a las 16:17 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para evitar que Python ejecute el código en un módulo al importarlo, puedes utilizar el siguiente enfoque:

    1. Define una función principal en tu módulo:

    En tu módulo principal (por ejemplo, main.py), define una función principal que contenga el código principal que deseas ejecutar.

    python
    

    main.py

    def main():

    Código principal aquí

    2. Importa el módulo como paquete:

    En el módulo de procesamiento por lotes (por ejemplo, batch.py), importa el módulo principal como un paquete y accede a la función principal directamente.

    python
    

    batch.py

    import main as main_module

    Llama a la función principal

    main_module.main()

    3. Utiliza el indicador __name__:

    Python proporciona un indicador especial llamado __name__ que contiene el nombre del módulo en ejecución actual. Puedes utilizar este indicador para verificar si el módulo se está ejecutando como script principal o se está importando.

    python
    

    main.py

    if __name__ == "__main__": main()

    4. Importa módulos específicos:

    En lugar de importar todo el módulo, puedes importar solo los módulos específicos que necesitas. Esto evitará que se ejecute cualquier otro código en el módulo.

    python
    

    batch.py

    from main import clase_especifica, funcion_especifica

    Ejemplo:

    python
    

    main.py

    def main(): print("Ejecutando el código de main.py")

    batch.py

    import main as main_module main_module.main()

    Cuando ejecutas batch.py, el código en main.py solo se ejecutará cuando se llame a la función main.

    Nota:

    Si necesitas acceder a las variables o funciones del módulo principal desde el módulo de procesamiento por lotes, utiliza la notación de punto para acceder a ellas desde el objeto del paquete importado. Por ejemplo:

    python
    

    batch.py

    import main as main_module print(main_module.alguna_variable)

    Respondida el Jun 30, 2011 a las 16:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0