opencv - procesos - funcion wait en c
¿Cómo usar la salida del proceso hijo en el proceso llamado sin terminar el proceso hijo? (2)
Mantenga una referencia
p = subprocess.Popen(command,shell=True, stdout = subprocess.PIPE)
Entonces puedes hacer
num = int(p.stdout.readline()) # blocks!
si lo haces
print(num) in the child process
También eche un vistazo al multiprocesamiento de módulos. Puede resolver el problema de otras maneras.
He creado dos módulos en python. Uno de los módulos es para crear GUI usando Tkinter y el segundo es para capturar y almacenar imágenes. Cuando llamé al módulo opencv en el módulo Tkinter, primero ejecuta el módulo opencv y luego de liberar la cámara, estaba ejecutando el módulo Tkinter. Así que usé el subproceso. Popen (). Ahora quiero la salida del subproceso en el módulo Tkinter. El código para crear GUI usando Tkinter es el siguiente.
import sys
from Tkinter import *
import Tkinter
import subprocess
def capcam():
command="python2 imacap.py"
subprocess.Popen(command,shell=True)
root=Tk()
add=Frame(root)
add.grid()
root.title("Test")
capcam()
button_height=11
button_width=29
button_ipadx=2
button_ipady=2
text_box = Entry(add,justify=RIGHT,width=100, font=100)
text_box.grid(row = 0, column = 1,columnspan = 5)
text_box.insert(0, "0")
bttn_3 = Button(add, height= button_height ,width= button_width,text = "3")
bttn_3.grid(row = 3, column = 2, padx=button_ipadx, pady=button_ipady)
A continuación está el código del proceso hijo.
import cv2.cv as cv
capture = cv.CaptureFromCAM(0)
num = 0
while True:
img = cv.QueryFrame(capture)
cv.SaveImage(''pic''+str(num)+''.jpg'', img)
if num == 500:
del(capture)
break
if cv.WaitKey(10) == 27:
break
num += 1
Quiero el valor de num variable en tiempo de ejecución en mainprocess y quiero pasarlo a la entrada sin terminar el proceso hijo.
¿Puedo manejar eventos Tk mientras espero por I / O? muestra cómo evitar el bloqueo mientras se lee una salida del subproceso desde el hilo de la GUI. Suponiendo que imacap.py
tiene print(num)
en ella:
def read_output(self, pipe, mask):
data = os.read(pipe.fileno(), 1 << 20)
if not data: # eof
root.deletefilehandler(proc.stdout)
else:
print("got: %r" % data)
proc = Popen(["python2", "imacap.py"], stdout=PIPE, stderr=STDOUT)
root.createfilehandler(proc.stdout, READABLE, read_output)
El ejemplo de código completo: tkinter-read-async-subprocess-output.py
demuestra cómo leer el resultado del subproceso sin hilos utilizando Tkinter. Muestra el resultado en la GUI y detiene el subproceso al presionar un botón.
Si tk.createfilehandler()
no funciona en su sistema; podrías intentar usar un hilo de fondo en su lugar. Consulte kill-process.py
para ver el ejemplo del código.