Бесконечные проблемы с очень простым подпроцессом Python. Открытое задание - PullRequest
1 голос
/ 23 апреля 2010

Я бы хотел, чтобы python отправлял около полумиллиона целых чисел в диапазоне 0-255 каждое в исполняемый файл, написанный на C ++. Этот исполняемый файл ответит несколькими тысячами целых чисел. Каждый на одной строке. Кажется, что это должно быть очень просто сделать с подпроцессом, но у меня были бесконечные проблемы. Сейчас я тестирую с кодом:

// main()
u32 num;
std::cin >> num;

u8* data = new u8[num];
for (u32 i = 0; i < num; ++i)
    std::cin >> data[i];

// test output / spit it back out
for (u32 i = 0; i < num; ++i)
    std::cout << data[i] << std::endl;

return 0;

Создание массива строк («данных»), каждая из которых похожа на «255 \ n», в python, а затем с использованием:

output = proc.communicate("".join(data))[0]

... не работает (говорит, что стандартный ввод закрыт, может быть, слишком много за один раз). Ни один из них не использовал proc.stdin и proc.stdout. Это должно быть очень просто, но я получаю постоянные исключения и / или мне не возвращаются выходные данные. Мой Попен сейчас:

proc = Popen('aux/test_cpp_program', stdin=PIPE, stdout=PIPE, bufsize=1)

Посоветуй мне, прежде чем я выдерну волосы. ;)

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Это прекрасно работает для меня:

#include <iostream>

int main()
{
    int num;
    std::cin >> num;

    char* data = new char[num];
    for (int i = 0; i < num; ++i)
        std::cin >> data[i];

    // test output / spit it back out
    for (int i = 0; i < num; ++i)
        std::cout << data[i] << std::endl;

    return 0;
}

питон:

In [9]: from subprocess import Popen, PIPE
In [10]: a = Popen('./a.out', stdin=PIPE, stdout=PIPE)
In [11]: a.stdin.write("2\nab")
In [12]: a.stdout.read()
Out[12]: 'a\nb\n'

Обратите внимание, что я добавил разделитель (\ n) между числом записываемых байтов, это самый безопасный способ, если вы не хотите, чтобы ваш c ++ cin не мог отправлять что-то вроде 3,1,2,3, которое бы объединялось с 3123, ожидая столько аргументов.

0 голосов
/ 24 апреля 2010

В C ++, когда вы читаете char или unsigned char из cin, он читает один байт из stdin. Тем не менее, вы ожидаете, что он будет читать десятичное представление числа от 0 до 255. Если вы читаете int, вместо этого он должен прочитать его правильно:

unsigned int n;
std::cin >> n;
data[i] = static_cast<u8>(n);

Или вместо этого вы можете заставить код Python записывать значения в виде последовательности байтов, а не цифр, используя функцию chr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...