tutorial - ¿Por qué Python está ejecutando mi módulo cuando lo importo, y cómo lo detengo?
python tutorial (9)
Tengo un programa de Python que estoy construyendo que se puede ejecutar de dos maneras: la primera es llamar a "python main.py", que solicita al usuario una entrada amigable y luego ejecuta la entrada del usuario a través del programa. La otra forma es llamar a "python batch.py -file- ", que pasará por encima de toda la recopilación de entrada amigable y ejecutará la validación de todo un archivo a través del programa 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 programa, inmediatamente falla 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?
Aunque no puede usar la import
sin ejecutar el código; hay una forma bastante rápida de ingresar tus variables; usando numpy.savez
, que almacena variables como matrices numpy en un archivo .npz. Luego puedes cargar las variables usando numpy.load
.
Vea una descripción completa en la documentación de scipy
Tenga en cuenta que este es solo el caso de variables y matrices de variable, y no de métodos, etc.
Debido a la forma en que funciona Python, 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 solo cuando se ejecuta directamente, puede protegerlo 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, suponga que esto está en el archivo foo.py
def main():
print "Hello World"
if __name__ == "__main__":
main()
Este programa se puede ejecutar yendo python foo.py
, o desde otro script de Python:
import foo
...
foo.main()
Hubo una propuesta de mejora de Python PEP 299 cuyo objetivo era reemplazar if __name__ == ''__main__'':
idioma con def __main__:
pero fue rechazado. Todavía es una buena lectura saber qué tener en cuenta al usar if __name__ = ''__main__'':
Intenta importar las funciones necesarias desde main.py? Asi que,
from main import SomeFunction
Es posible que haya nombrado una función en batch.py igual a una en main.py, y cuando importe main.py, el programa ejecute la función main.py en lugar de la función batch.py; hacer lo anterior debería arreglar eso. Espero.
Lamentablemente, no es así. Eso es parte de cómo funciona la sintaxis de importación y es importante que lo haga, recuerde que def
es realmente algo ejecutado; si Python no ejecutó la importación, estaría, bueno, atascado sin funciones.
Sin embargo, dado que probablemente tengas acceso al archivo, es posible que puedas mirar y ver qué causa el error. Es posible modificar su entorno para evitar que ocurra el error.
Porque así es como funciona Python: las palabras clave como class
y def
no son declaraciones . En cambio, son declaraciones en vivo que se ejecutan. Si no se ejecutaran, su módulo serí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 ¿ Para qué sirve if __name__ == "__main__"
?
Sin embargo, requiere control de fuente sobre el módulo que se está import
.
Feliz codificación.
Puede escribir su "main.py" de esta manera:
#!/usr/bin/env python
__all__=["somevar", "do_something"]
somevar=""
def do_something():
pass #blahblah
if __name__=="__main__":
do_something()
Use el idioma if __name__ == ''__main__''
- __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 importa. Entonces harías algo como
# imports
# class/function definitions
if __name__ == ''__main__'':
# code here will only run when you invoke ''python main.py''
ponga el código dentro de una función y no se ejecutará hasta que llame a la función. Debería tener una función principal en su main.py. con la declaración:
if __name__ = ''__main__'': main()
luego, si llama a "python main.py", se ejecutará la función main (). Si importa main.py, no lo hará. Además, probablemente debería cambiar el nombre de main.py a otra cosa por motivos de claridad.