0

Debo trabajar con 2 script.. al terminar la ejecucion del 1ero ejecuto el 2do con exec(open("").read()) desde el 1ro importo las variables que quiero utilizar en el 2do pero me ejecuta todo el 1er script desde el inicio.. esto se ve porque estoy trabajando con imagenes en opencv y lo que hace es que al terminar el script 1 antes de iniciar el 2do me vuelve a abrir las imagenes.. la solucion que eh encontrado es correr primero el 2do script omitiendo el exec(open("").read()) pero no me parece optimo.. porque hace lo que quiero pero me da error de funciones que nunca fueron utilizadas en el 2do script hay forma de importar las variables sin que corra todo el 1er script nuevamente

------- script1.py---------

import cv2
import numpy as np 

img_cam = cv2.imread("img/img.jpg", 1)
cv2.imshow("Imagen", img_cam)
size = 400
puntos1 = np.array([[294, 207], [481, 219], [299, 381], [477, 378]])
puntos2 = np.array([[0, 0], [size, 0], [0, size], [size, size]], dtype="float32") 

matrix = cv2.getPerspectiveTransform(puntos1, puntos2)
result_camera = cv2.warpPerspective(img_cam, matrix, (400, 400))
cv2.imshow("Transformacion Camera", result_camera)
cv2.waitKey(0)
cv2.destroyAllWindows()

__all__ = [ 'matrix' ]        
exec(open("script2.py").read())

------- script2.py--------------

...

from script1 import matrix

....

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
RazerJs
  • 2,253
  • 2
  • 10
  • 36
  • No entiendo muy bien tu pregunta, pero si te refieres a pasar argumentos a tu segundo script puedes usar os.system() Revisa estos dos enlaces: https://stackoverflow.com/questions/3781851/run-a-python-script-from-another-python-script-passing-in-args https://stackoverflow.com/questions/1186789/what-is-the-best-way-to-call-a-script-from-another-script – ivanc Mar 11 '19 at 11:55
  • Cuando haces `import modulo` se ejecuta el contenido del módulo al completo, aunque solo importes algunos símbolos. No estoy seguro de lo que quieres hacer, pero si entendí bien tendrías dos opciones: 1) Ejecutar el primer script y después volcar a disco el resultado que tienes en `matrix` (usando por ejemplo el modulo `pickle`). Desde el segundo script cargarías ese resultado. 2) Definir en script2 alguna función que reciba `matrix` como parámetro .Al final de script1, en lugar de ese `exec()` que me parece una barbaridad, harías `from script2 import funcion` para llamarla pasándole `matrix` – abulafia Mar 11 '19 at 12:36

1 Answers1

1

Posiblemente sea algo de concepto. Al importar un script, python lo va a intentar ejecutar inmediatamente, a menos que ese script contenga funciones o clases con métodos, siempre y cuando no sean instanciadas dentro del script.

Vamos a los ejemplos para entenderlo mejor.

Si tenemos 2 scripts, script01.py

def func1():
    print("Esta es la funcion 1")

class clx:
    def __init__(self):
        pass

    def metodo1(self):
        print("Este es el metodo 1 de la clase clx")

    def metodo2(self, msg):
        print(f"Mensaje: {msg}");

Y script02.py

import script01 as s1

def func2():
    print("Esta es la funcion 2")

xc = s1.clx()

if __name__ == "__main__":
    xc.metodo1()

Ahora desde la terminal de python importamos al script02

>>> import script02 as s2
>>> s2.func2()
Esta es la funcion 2
>>> s2.s1.func1() # Ejecutar una funcion de s1
Esta es la funcion 1
>>> s2.xc.metodo1() # Ejecutar un metodo de s1 del objeto xc en s2
Este es el metodo 1 de la clase clx
>>> s2.xc.metodo2("Hola usuario")
Mensaje: Hola usuario
>>> s2.s1.clx().metodo2("Hola usuario") # Acceder a un metodo de s1 sin instanciar en s2.
Mensaje: Hola usuario
>>> yc = s2.s1.clx()
>>> yc.metodo1()
Este es el metodo 1 de la clase clx
>>>

La única instrucción que se ejecuta, por estar fuera de clases o funciones, es la línea xc = s1.clx(), la cual la puse solo para las pruebas, pero no es necesaria para el funcionamiento (por ejemplo, yc instancia un objeto igual fuera de s2). Debido a que esa línea instancia un objeto sin acciones en el constructor (pass), no hay ninguna salida al importar script02. Pero podrías probar poniendo un print("** algo **") dentro del def__init__(self) del script01 y verás que al importar script02 entonces si aparecerá el mensaje inmediatamente.

La línea if __name__ == "__main__": a grosso modo sirve para que no se ejecute lo que está debajo si el módulo es importado con import [ Mas información ]. Sin embargo si se ejecuta el script02 directamente saldría esto.

> python script02.py
Este es el metodo 1 de la clase clx

> python script01.py
  # No pasa nada

En resumidas cuentas, debes adaptar tu lógica con funciones o clases para que al importar estas solo se carguen en memoria y no se ejecuten hasta cuando tu lo requieras.

aeportugal
  • 7,106
  • 2
  • 9
  • 21