canalizando dados binários entre python e c ++

Eu tenho trabalhado em um plugin para o QGIS usando o Python 2.7, que funciona bem até que eu efetue algum processamento de imagem nas camadas mapeadas. Mesmo tarefas simples, como coletar os valores RGB da camada raster (por exemplo, uma seção de 5k x 1k), demoram um pouco (~ 2 minutos). Eu poderia conviver com isso se fosse necessário, mas quando começo a calcular métricas simples nos dados (como Entropy), a quantidade de tempo necessária para o processamento explode (eu parei o processamento após ~ 40 minutos sem resposta).

Eu escrevi o código Entropy antes em C ++ e adoraria poder processar os dados dessa maneira. Depois de fazer algumas pesquisas, descobri que o Python pode usar stdin e stdout para canalizar dados e me deparei com o exemplo a seguir, enterrado em um fórum nohttp://ubuntuforums.org/archive/index.php/t-524072.html

usando esse código Python como um driver

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"

e esse código c ++ como processador de dados

#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;
}

Esse código funciona muito bem para dados de texto. Posso canalizar o texto para frente e para trás o dia inteiro. mas o que eu quero fazer é passar dados binários para frente e para trás, para que eu possa enviar os dados da camada rasterizada inteira de python para c ++ para processamento e, em seguida, retornar os resultados.

Eu olhei em volta e tentei várias combinações de colocar um buffer de bytes em

proc.stdin.write(bufferdata)

e usando

fread(Arraypointer, 4,1,stdin) 

para receber os dados do buffer no lado do programa c ++, bem como

fwrite(outArraypointer,4,1,stdout)

canalizar dados de volta para python, mas não foram bem-sucedidos. Acho que parte do problema pode ser que a versão em texto use cin e aguarde o indicador EOL. Não estou claro como fazer algo semelhante no caso de dados binários.

Gostaria de saber como modificar o código de exemplo acima para enviar um int de um programa python para um programa c ++. incremente o int no programa c ++ e envie-o de volta ao programa python. lembre-se de que terei que fazer isso com milhões de ints de cada vez, caso isso seja prejudicial à sua solução proposta.

Se isso não der certo, passarei a apenas ter o python gravando um arquivo binário no qual o código c ++ lê, mas eu realmente gostaria de usar essa abordagem, se possível.

Obrigado pela ajuda antes do tempo.

Atualizar&nbsp;A solução da Roland foi o ponto de partida de que eu precisava. Para quem vem depois, um protótipo funcional do código que descrevi acima está abaixo. É uma ligeira modificação do sistema de Roland.

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

Processador 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;
}