我正在努力解决问题。我有Python程序,它将数组发送到C ++ exe。但是我无法从C ++接收数组。我的python代码:
import struct
import subprocess
from cStringIO import StringIO
stdin_buf = StringIO()
array = [1.0 for _ in range(10)]
for item in array:
stdin_buf.write(struct.pack('<f', item))
proc = subprocess.Popen(['Comsol1.exe'], stdin=subprocess.PIPE, stdout = subprocess.PIPE)
out, err = proc.communicate(stdin_buf.getvalue())
# assuming the result comes back the same way it went in...
item_len = struct.calcsize('<f')
stdout_buf = StringIO(out)
stdout_buf.seek(0)
for i in range(len(out)/item_len):
val = struct.unpack('<f', stdout_buf.read(4))
print (val)
C ++代码:
// Comsol1.cpp:定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include <streambuf>
#include "stdafx.h"
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
int main(void)
{
int result;
// Set "stdin" to have binary mode:
result = _setmode(_fileno(stdin), _O_BINARY);
if (result == -1)
perror("Cannot set mode");
else
fprintf(stderr, "'stdin' successfully changed to binary mode\n");
// Set "stdout" to have binary mode:
result = _setmode(_fileno(stdout), _O_BINARY);
if (result == -1)
perror("Cannot set mode");
else
fprintf(stderr, "'stdout' successfully changed to binary mode\n");
int i = 0;
while (!std::cin.eof())
{
float value;
std::cin.read(reinterpret_cast<char*>(&value), sizeof(value));
if (std::cin.gcount() > 0)
{
std::cerr << "Car " << i << ": " << value << std::endl;
i++;
}
}
}
谢谢。
答案 0 :(得分:1)
所以你有两个问题:
您正在打印到stderr而不是stdout,并且因为stderr没有管道,所以当您运行python脚本时,实际上会将消息打印到控制台。
您正在打印的不只是浮动到stdout而不是原始二进制模式。如果您希望从out
(在python中)读取浮点数列表,则必须仅打印浮点数(在c ++中)和二进制模式:
std::cout.write(reinterpret_cast<const char*>(&value), sizeof(value));
我在Ubuntu上尝试了上述方法并且它正常工作。您可以找到我的源代码here。我不得不调整代码来处理unix,但你可以得到这个想法。