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

Tengo un progtwig Python que estoy creando y que puede ejecutarse de dos maneras: la primera es llamar a “python main.py”, que solicita al usuario una entrada de manera amigable y luego ejecuta la entrada del usuario a través del progtwig. La otra forma es llamar a “python batch.py -file- “, que pasará por encima de toda la recostackción de entrada amigable y ejecutará la entrada de un archivo completo a través del progtwig de una sola vez.

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

import main 

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

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

Porque así es como funciona Python, las palabras clave como class y def no son declaraciones . En su lugar, son declaraciones reales en vivo que se ejecutan. Si no se ejecutaran, su módulo estaría … vacío 🙂

De todos modos, 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() 

Consulte ¿Qué es if __name__ == "__main__" para?

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

Feliz codificacion

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

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

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

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

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

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

 import foo ... foo.main() 

Utilice if __name__ == '__main__' idiom – __name__ es una variable especial cuyo valor es '__main__' si el módulo se está ejecutando como un script, y el nombre del módulo si se importó. Así que harías algo como

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

Desafortunadamente, no lo haces. Eso es parte de cómo funciona la syntax de importación y es importante que lo haga. Recuerda que en realidad es algo que se ejecuta, si Python no ejecutó la importación, estarías atascado sin funciones.

Sin embargo, como es probable que tenga acceso al archivo, puede buscar y ver qué causa el error. Podría ser posible modificar su entorno para evitar que el error ocurra.

Ponga el código dentro de una función y no se ejecutará hasta que llame a la función. Debes tener una función principal en tu main.py con la statement:

 if __name__ == '__main__': main() 

Luego, si llama a python main.py la función main() se ejecutará. Si importa main.py , no lo hará. Además, probablemente deberías cambiar el nombre de main.py por algo más por claridad.

Puedes escribir tu “main.py” así:

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

Hubo una propuesta de mejora de Python PEP 299 que apunta a reemplazar if __name__ == '__main__': idioma con def __main__: pero fue rechazada. Todavía es una buena lectura para saber qué tener en cuenta al usar if __name__ = '__main__':

Aunque no puede utilizar la import sin ejecutar el código; hay una forma bastante rápida en la que puedes ingresar tus variables; usando numpy.savez , que almacena variables como matrices numpy en un archivo .npz. Después puede cargar las variables usando numpy.load .

Ver una descripción completa en la documentación de scipy.

Tenga en cuenta que este es solo el caso de las variables y matrices de variables, y no de los métodos, etc.

Intenta simplemente importar las funciones necesarias de main.py? Asi que,

 from main import SomeFunction 

Puede ser que hayas nombrado una función en batch.py ​​igual que una en main.py, y cuando importas main.py, el progtwig ejecuta la función main.py en lugar de la función batch.py; haciendo lo anterior debería arreglar eso. Espero.