Подпроцесс Python Popen: отправка двоичных данных в C ++ в Windows

После трех дней интенсивного поиска в Google и переполнения стека, я более или менее заставил свою программу работать. Я перепробовал много вещей и нашел много ответов, так или иначе связанных с моей проблемой, но не нашел решения. Sry я должен пропустить нужную страницу! Я с нетерпением жду комментариев и рекомендаций.

Задача:

Отправка двоичных данных (float) из python в программу C ++, возврат нескольких поплавковДанные будут на входе звуковой карты 20 мс, задержка немного критичнаПлатформа: Windows (только из-за драйверов для звуковой карты ...)Заполнен трубами, но без связи, потому что я хочу, чтобы программа C ++ была открыта

В Ubuntu все отлично работало с тестовыми данными. В Windows я столкнулся с проблемой двоичного потока: Windows проверяет поток с плавающей запятой на наличие символа EOF и находит его случайным образом. Затем все останавливается, ожидая данных instream, которые находятся прямо за стеной «eof». Или так я себе это представляю.

В конце концов эти две вещи были необходимы:

#include <io.h>
#include <fcntl.h>

а также

if (_setmode(_fileno(stdin), _O_BINARY) == -1) 
  {cout << "binary mode problem" << endl; return 1;};

в C ++, как описано здесь:https://msdn.microsoft.com/en-us/library/aa298581%28v=vs.60%29.aspx.

cin.ignore () зависает в бинарном режиме! Угадай, потому что больше нет ничего. Не пытался / думать об этом слишком тщательно, хотяcin.read (mem, sizeof (float) * length) делает работу, так как я знаю длину потока данныхСкомпилировано с MinGW

и в коде Python тоже самое! (сначала забыл, стоил мне день)

if sys.platform.find("win") > -1:
  import msvcrt,os      
  process = subprocess.Popen("cprogram.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,bufsize=2**12)
  msvcrt.setmode(process.stdin.fileno(), os.O_BINARY)

а также

process.stdin.write(data.tostring())

Ответы на вопрос(0)

Ваш ответ на вопрос