Небуферизованное взаимодействие между C++ и Python

Я хочу передать данные из C++ в Python в Linux, и я делаю это через канал. Моя программа на C++ выглядит так:

#include<iostream>
#include<stdio.h>
#include<sstream>
#include<math.h>

int main() {
    FILE *cmd;

    std::ostringstream ss;
    double val;

    cmd = popen("python plot.py","w");
    for (int i=0; i<100; i++) {
        val = cos(3.14159*i/40);
        ss.str("");
        ss << val << std::endl;
        fputs(ss.str().c_str(),cmd);
        fflush(cmd);
    }
    fputs("\n",cmd);
    fflush(cmd);
    pclose(cmd);
    return 0;     
}

Соответствующая функция python plot.py выглядит так:

fig, = plt.plot([],[])
index = 0
plt.ion()
while True:
    data = sys.stdin.readline().strip()
    if not data:
        plt.ioff()
        break
    index = index + 1
    val = [float(n) for n in self.data.split()]

    fig.set_xdata(numpy.append(fig.get_xdata(),index))
    fig.set_ydata(numpy.append(fig.get_ydata(),val))
    axis = list(plt.axis())
    min_x = 0      
    max_x = max(self.fig.get_xdata())
    min_y = min(self.fig.get_ydata())
    max_y = max(self.fig.get_ydata())
    axis[0] = min_x
    axis[1] = max_x
    axis[2] = min_y
    axis[3] = max_y
    plt.axis(axis)
    plt.draw()
plt.show()

Теперь моя проблема заключается в том, что перед передачей данных в функцию python, похоже, происходит буферизация данных из моей функции C++, от которой я не могу избавиться. Я искал решение, но не смог его найти. Лучшее предложение, которое я смог найти, это использовать setvbuf в функции C++, поэтому я также попытался включить следующую строку в функцию C++

setvbuf(cmd,NULL,_IONBUF,0)

Но это не имело никакого эффекта.

Кто-нибудь знает, как я могу передавать данные из моей функции C++ в Python небуферизованным способом?

0 ответов

Другие вопросы по тегам