gpt4 book ai didi

python - 在 python 和 c++ 之间管道传输二进制数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:08 25 4
gpt4 key购买 nike

我一直在使用 Python 2.7 开发 QGIS 的插件,在我真正对映射图层进行一些图像处理之前它工作正常。即使是收集栅格图层(比如 5k x 1k 部分)的 RGB 值这样的简单任务也需要一点时间(约 2 分钟)。如果必须的话,我可以接受,但是当我开始计算数据的简单指标(如熵)时,处理所需的时间量激增(我在大约 40 分钟无响应后停止了处理)。

我以前用 C++ 编写过 Entropy 代码,希望能够以这种方式处理数据。在做了一些研究之后,我发现 Python 可以使用 stdin 和 stdout 来传输数据,并在 http://ubuntuforums.org/archive/index.php/t-524072.html 的论坛中发现了以下示例。

使用此 Python 代码作为驱动程序

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"

这个c++代码作为数据处理器

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

此代码非常适用于文本数据。我可以整天用它来回传输文本。但我想做的是来回传递二进制数据,以便我可以将整数栅格图层数据从 python 发送到 c++ 进行处理,然后返回结果。

我环顾四周并尝试了将字节缓冲区放入

的各种组合
proc.stdin.write(bufferdata)

并使用

fread(Arraypointer, 4,1,stdin) 

用于在c++程序端接收缓冲区数据以及

fwrite(outArraypointer,4,1,stdout)

将数据通过管道传回 python,但尚未成功。我认为部分问题可能是文本版本使用了 cin 并等待 EOL 指示器。我不清楚如何在二进制数据的情况下做类似的事情。

我想知道如何修改上面的示例代码以将 int 从 python 程序发送到 c++ 程序。在 c++ 程序中增加 int,然后将该 int 发送回 python 程序。请记住,我将不得不一次使用数百万个整数来执行此操作,以防对您提出的解决方案提出警告。

如果这不起作用,我将转而让 python 写出一个二进制文件,供 C++ 代码读取,但如果可能的话,我真的很想使用这种方法。

提前感谢您的帮助。

更新 Roland 的解决方案是我需要的起点。对于后来的人,下面是我上面描述的代码的工作原型(prototype)。这是对罗兰的略微修改

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

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

最佳答案

问题可能出在缓冲上:默认情况下,C stdio 缓冲所有写入 stdout 的内容,并仅在写入换行符时将缓冲区刷新回管道(行缓冲)。当您调用 fflush(stdout) 时问题消失了写完之后。您还可以通过 setvbuf 禁用(或控制)缓冲<stdio.h> 中定义的函数,例如使用 setvbuf(stdout, NULL, _IONBF, 0)完全禁用缓冲。

我用以下两个程序测试了第一个变体:

import subprocess

proc = subprocess.Popen("./echotest",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)

proc.stdin.write('abc')
message = proc.stdout.read(3)
print "return message ->" + message + " written by python \n"
proc.stdin.write('q')
proc.wait()

和一个小的 C 程序:

#include <stdio.h>

int main (int argc, char **argv) {
for (;;) {
char buf;
fread(&buf, 1, 1, stdin);
if ('q' == buf)
break;
fwrite(&buf, 1, 1, stdout);
fflush(stdout);
}

return 0;
}

请注意,您必须指定要从子进程读回多少字节,否则程序将阻塞,等待更多输出。如果这让您感到困扰,请尝试 this question 的解决方案之一。 .

关于python - 在 python 和 c++ 之间管道传输二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com