Tengo un programa Python que estoy construyendo que se puede ejecutar de dos maneras: la primera es llamar a "python main.py", que solicita al usuario que ingrese de manera 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 alto toda la recopilación de entrada amigable y ejecutará todo el archivo de entrada 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, se produce un error inmediato 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?
fuente
Debido a la forma en que funciona Python, es necesario que ejecute sus módulos cuando los importa.
Para evitar que se ejecute código en el módulo cuando se importa, pero solo cuando se ejecuta directamente, puede protegerlo con esto
if
:Es posible que desee poner este código en un
main()
método, de modo que pueda ejecutar el archivo directamente o importar el módulo y llamar almain()
. Por ejemplo, suponga que esto está en el archivofoo.py
.Este programa se puede ejecutar yendo
python foo.py
o desde otro script de Python:fuente
Use el
if __name__ == '__main__'
idioma:__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 comofuente
Lamentablemente no. Eso es parte de cómo funciona la sintaxis de importación y es importante que lo haga, recuerde
def
que en realidad es algo ejecutado, si Python no ejecutó la importación, estaría, bueno, atascado sin funciones.Sin embargo, dado que probablemente tenga acceso al archivo, es posible que pueda ver y ver qué causa el error. Es posible que pueda modificar su entorno para evitar que ocurra el error.
fuente
Ponga el código dentro de una función y no se ejecutará hasta que llame a la función. Deberías tener una función principal en tu
main.py
. con la declaración:Entonces, si llamas
python main.py
lamain()
función se ejecutará. Si importamain.py
, no lo hará. Además, probablemente debería cambiar el nombremain.py
a otra cosa por razones de claridad.fuente
Hubo una propuesta de mejora de Python PEP 299 que tenía como objetivo reemplazar la
if __name__ == '__main__':
expresión idiomáticadef __main__:
, pero fue rechazada. Todavía es una buena lectura saber qué tener en cuenta al usarif __name__ = '__main__':
.fuente
Puede escribir su "main.py" de esta manera:
fuente
Aunque no puede usar
import
sin ejecutar el código; hay una manera bastante rápida de ingresar sus variables; mediante el usonumpy.savez
, que almacena variables como matrices numpy en un archivo .npz. Luego puede cargar las variables usandonumpy.load
.Vea una descripción completa en la documentación scipy
Tenga en cuenta que este es solo el caso para variables y matrices de variables, y no para métodos, etc.
fuente
¿Intenta importar las funciones necesarias desde main.py? Entonces,
Puede ser que haya nombrado una función en batch.py igual que una en main.py, y cuando importa main.py el programa ejecuta la función main.py en lugar de la función batch.py; hacer lo anterior debería arreglar eso. Espero.
fuente
import main
NO importa todo, desde main al espacio de nombres actual. Solo agrega un solomain
símbolo en el espacio de nombres actual, por lo que no pueden ocurrir colisiones.