piping Binärdaten zwischen Python und C ++

Ich habe mit Python 2.7 an einem Plugin für QGIS gearbeitet, das einwandfrei funktioniert, bis ich tatsächlich einige Bildbearbeitungen für die zugeordneten Ebenen vornehme. Selbst einfache Aufgaben wie das Erfassen der RGB-Werte der Rasterebene (z. B. ein 5k x 1k-Abschnitt) dauern etwas (~ 2 Minuten). Ich könnte damit leben, wenn ich müsste, aber wenn ich anfange, einfache Metriken für die Daten (wie Entropy) zu berechnen, explodiert die für die Verarbeitung benötigte Zeit (ich habe die Verarbeitung nach ~ 40 nicht reagierenden Minuten abgebrochen).

Ich habe den Entropy-Code zuvor in C ++ geschrieben und würde die Daten gerne einfach so verarbeiten. Nach einigen Recherchen stellte ich fest, dass Python stdin und stdout verwenden kann, um Daten weiterzuleiten, und fand das folgende Beispiel in einem Forum unterhttp: //ubuntuforums.org/archive/index.php/t-524072.htm

Verwendung dieses Python-Codes als Treiber

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"

und dieser C ++ - Code als Datenverarbeiter

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

Dieser Code eignet sich hervorragend für Textdaten. Ich kann damit den ganzen Tag Text hin und her leiten. Ich möchte jedoch Binärdaten hin und her übergeben, damit ich die Ganzzahl-Raster-Layer-Daten zur Verarbeitung von Python an c ++ senden und dann die Ergebnisse zurückgeben kann.

Ich habe mich umgesehen und verschiedene Kombinationen aus dem Einfügen eines Byte-Puffers in @ ausprobier

proc.stdin.write(bufferdata)

und mit

fread(Arraypointer, 4,1,stdin) 

zum Empfangen der Pufferdaten auf der C ++ - Programmseite sowie

fwrite(outArraypointer,4,1,stdout)

, um Daten zurück zu Python zu leiten, aber nicht erfolgreich. Ich denke, dass ein Teil des Problems darin besteht, dass die Textversion cin verwendet und auf den EOL-Indikator wartet. Ich bin mir nicht sicher, wie ich bei Binärdaten etwas Ähnliches tun soll.

Ich möchte wissen, wie der obige Beispielcode geändert werden kann, um ein Int von einem Python-Programm an ein C ++ - Programm zu senden. Inkrementieren Sie das int im c ++ - Programm und senden Sie es dann zurück an das Python-Programm. Bitte denken Sie daran, dass ich dies mit Millionen von Ints gleichzeitig tun muss, falls sich Ihre vorgeschlagene Lösung negativ auswirkt.

Wenn dies nicht klappt, werde ich Python dazu bringen, eine Binärdatei zu schreiben, die vom C ++ - Code eingelesen wird, aber ich würde diesen Ansatz wirklich gerne anwenden, wenn es möglich ist.

Vielen Dank für die Hilfe im Voraus.

Aktualisiere Rolands Lösung war der Ausgangspunkt, den ich brauchte. Für diejenigen, die später kommen, ist ein funktionierender Prototyp des Codes, den ich oben beschrieben habe, unten. Es ist eine leichte Modifikation von Rolands

Python-Treiber:

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

C ++ Prozessor

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage