canalizar datos binarios entre python y c ++

He estado trabajando en un complemento para QGIS usando Python 2.7 que funciona bien hasta que realmente voy a hacer un procesamiento de imagen en las capas asignadas. Incluso tareas simples como recopilar los valores RGB de la capa ráster (digamos una sección de 5k x 1k) toman un poco (~ 2 minutos). Podría vivir con eso si tuviera que hacerlo, pero cuando empiezo a calcular métricas simples sobre los datos (como Entropy), la cantidad de tiempo necesaria para el procesamiento explota (detuve el procesamiento después de ~ 40 minutos sin respuesta).

He escrito el código de Entropía antes en C ++ y me encantaría poder procesar los datos de esa manera. Después de investigar un poco, descubrí que Python puede usar stdin y stdout para canalizar datos y encontré el siguiente ejemplo enterrado en un foro enhttp://ubuntuforums.org/archive/index.php/t-524072.html

usando este código de Python como controlador

import subprocess

proc = subprocess.Popen("C:\Python27\PythonPipes.exe",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)

state = "run"
while state == "run":
    input = raw_input("Message to CPP>> ")

    if input == "quit":
        state = "terminate" # any string other than "run" will do

    proc.stdin.write(input + "\n")
    cppMessage = proc.stdout.readline().rstrip("\n") 
    print "cppreturn message ->" + cppMessage + " written by python \n"

y este código c ++ como procesador de datos

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* args[]){

    string python_message = "";
    bool quit = false;

    while (!quit){
        cin >> python_message;

        if (python_message == "quit"){
            quit = true;
        }
        else if (python_message == "first"){
            cout << "First Hello!" << endl;
        }
        else if (python_message == "second"){
            cout << "Second Hello!" << endl;
        }
        else if (python_message == "third"){
            cout << "Third Hello!" << endl;
        }
        else {
            cout << "Huh?" << endl;
        }
    }
    return 0;
}

Este código funciona muy bien para datos de texto. Puedo enviar mensajes de texto todo el día con ellos. pero lo que quiero hacer es pasar datos binarios de un lado a otro para que pueda enviar los datos de la capa ráster entera de python a c ++ para su procesamiento, y luego devolver los resultados.

Miré a mi alrededor y probé varias combinaciones de poner un búfer de bytes en

proc.stdin.write(bufferdata)

y usando

fread(Arraypointer, 4,1,stdin) 

para recibir los datos del búfer en el lado del programa c ++, así como

fwrite(outArraypointer,4,1,stdout)

para canalizar datos de vuelta a Python, pero no han tenido éxito. Creo que parte del problema puede ser que la versión de texto usa cin y espera el indicador EOL. No tengo claro cómo hacer algo similar en el caso de los datos binarios.

Me gustaría saber cómo modificar el código de ejemplo anterior para enviar un int desde un programa python a un programa c ++. incremente el int en el programa c ++ y luego envíe ese int nuevamente al programa python. tenga en cuenta que voy a tener que hacer esto con millones de entradas a la vez en caso de que tenga dudas sobre su solución propuesta.

Si esto no funciona, pasaré a que Python escriba un archivo binario en el que se lee el código de C ++, pero realmente me gustaría utilizar este enfoque si es posible.

Gracias por la ayuda de antemano.

Actualizar La solución de Roland fue el punto de partida que necesitaba. Para aquellos que vienen más tarde, a continuación se muestra un prototipo funcional del código que describí anteriormente. Es una ligera modificación de Roland

Controlador Python:

import subprocess

proc = subprocess.Popen("C:\Python27\PythonPipes.exe",
stdin=subprocess.PIPE,stdout=subprocess.PIPE)

s1 = bytearray(10)   

s1[0] = 65 #A
s1[1] = 66 #B
s1[2] = 67 #C
s1[3] = 68 #D
s1[4] = 69 #E
s1[5] = 70 #F
s1[6] = 71 #G
s1[7] = 72 #H
s1[8] = 73 #I

t = buffer(s1)       

proc.stdin.write(t)
value = [0,0,0,0,0,0,0,0]
for i in range(8):
    value[i] = ord(proc.stdout.read(1))
    print "value i -> " + str(value[i])

proc.stdin.write('q')
proc.wait()

Procesador C ++

#include <stdio.h>
char increase;
int main(int argc, char **argv) {
    for (;;) {
        char buf;
        fread(&buf, 1, 1, stdin);
        if ('q' == buf)
            break;
        increase = buf + 1;
        fwrite(&increase, 1, 1, stdout);
        fflush(stdout);
    }

    return 0;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta