Подпроцесс 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())