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 MinGW

y 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())

Respuestas a la pregunta(0)

Su respuesta a la pregunta