Передача данных из C в Python в Ubuntu

Я пытаюсь сгенерировать числа на C, затем передать их на python и распечатать данные с помощью sys.stdin. Код для генерации чисел в C таков:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>

int main() {
        unsigned int i;

        srand(time(NULL));

        while (1) {
                i = random() % 15000;
                printf("%u.%03u", i / 1000, i % 1000);
                printf("\n");
                usleep(100 * 1000);
        }
}

и программа для чтения и печати этого в python такова:

import sys

while(1):
    for line in sys.stdin:
        print(line[:-1])

Затем, после компиляции файла c gcc gen.c, я передаю его в python ~/a.out | python3 new.py. Однако это работает только тогда, когда я удаляю часть usleep в коде C. Когда я удаляю бит usleep, он работает нормально, но с частью usleep он ничего не печатает и кажется, что он застревает в строке 4 в new.py.

🤔 А знаете ли вы, что...
Python поддерживает динамическую типизацию, что облегчает разработку.


1
43
1

Ответ:

Решено

Вам просто нужно очистить вывод. Причина объясняется в Почему stdout нуждается в явной очистке при перенаправлении в файл?, т. е. конвейер изменяет поведение буферизации.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
//#include <Windows.h>

int main() {
        unsigned int i;

        srand(time(NULL));

        while (1) {
                i = random() % 15000;
                printf("%u.%03u", i / 1000, i % 1000);
                printf("\n");
                fflush(stdout);
                usleep(1000 * 1000);

        }
}
$ gcc gen.c -o gen       
$ ./gen  | python3 new.py
14.383
0.886