Subproceso de Python Popen: envíe datos binarios a C ++ en Windows
Después de tres días de uso intensivo de google y stackoverflow, más o menos conseguí que mi programa funcionara. Probé muchas cosas y encontré muchas respuestas relacionadas de alguna manera con mi problema, pero no había una solución que funcionara. ¡Sry debería haberme perdido la página correcta! Espero comentarios y recomendaciones.
Tarea:
Enviar datos binarios (flotantes) desde Python al programa C ++, recuperar algunos flotantesLos datos serán una entrada de tarjeta de sonido de 20 ms, la latencia es un poco críticaPlataforma: Windows (solo debido a controladores para la tarjeta de sonido ...)Popen con tuberías, pero sin comunicar, porque quiero mantener abierto el programa C ++Todo funcionó bien en ubuntu con datos de prueba. En Windows me encontré con el problema del flujo binario: Windows comprueba el flujo flotante para ver si tiene caracteres EOF y lo encuentra al azar. Entonces todo se congela, esperando los datos de entrada que están justo detrás del muro "eof". O eso me lo imagino.
Al final, estas dos cosas fueron necesarias:
#include <io.h>
#include <fcntl.h>
y
if (_setmode(_fileno(stdin), _O_BINARY) == -1)
{cout << "binary mode problem" << endl; return 1;};
en C ++ como se describe aquí:https://msdn.microsoft.com/en-us/library/aa298581%28v=vs.60%29.aspx.
cin.ignore () se congela usando el modo binario! Supongo que ya no hay eof. Sin embargo, no lo intenté / pensé demasiado en estocin.read (mem, sizeof (float) * length) hace el trabajo, ya que sé la longitud del flujo de datosCompilado con MinGWy en el código Python lo mismo! (Olvidé esto primero, me costó un día):
if sys.platform.find("win") > -1:
import msvcrt,os
process = subprocess.Popen("cprogram.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,bufsize=2**12)
msvcrt.setmode(process.stdin.fileno(), os.O_BINARY)
y
process.stdin.write(data.tostring())