Python Popen не фиксирует стандартный вывод программы.Не уверен почему - PullRequest
0 голосов
/ 19 декабря 2018

У меня три программы.Первый - это просто тестирование чтения с subprocess.Popen.Вторая - это программа, в которой есть stdout и stdin, использующие cout / cin на c ++.Третье - то же самое приложение, за исключением того, что оно использует printf и fgets.

import subprocess
import shlex
import os


def main():
    proc = subprocess.Popen(
        shlex.split('/home/art/dlm/test1'),
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    data = b''
    old_len = 0
    while True:
        print('Progress 1')
        data += proc.stdout.read(1)
        print('Progress 2')
        if old_len == len(data):
            break
        old_len = len(data)
        print(data)
    print('Progress 3')


if __name__ == '__main__':
    main()

Программа # 2.

#include <iostream>

using namespace std;

int main() {
    char _input[100];
    cout << "Line 1 test" << endl;
    cout << "Line 1 test" << endl;
    cout << "Line 3 test" << endl;
    cout << "Thoughts? ";
    cin >> _input;
    cout << _input << endl;
    return 1;
}

Вывод из программы # 2 c ++ читаетсябайт за байтом и выводится на экран, как я и ожидал.Ниже приведена программа № 3.

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

using namespace std;

int main() {
    char _input[100];
    /*cout << "Line 1 test" << endl;
    cout << "Line 2 test" << endl;
    cout << "Line 3 test" << endl;
    cout << "Thoughts? ";*/
    printf("Line 1 test\n");
    printf("Line 2 test\n");
    printf("Line 3 input: ");
    fgets(_input, sizeof(_input), stdin);
    printf("Line 4 test: %s\n", _input);
    //cin >> _input;
    //cout << _input << endl;
    return 1;
}

Этот вывод НЕ виден по каналу Popen.Фактически, если я перенаправляю его в файл, файл захватывает 0 байт.

Это тест, который я делаю, потому что у меня на работе приложение, которое написано так же, как программа № 3 с использованием printf и fgets и я пытаюсь написать скрипт python3 для связи с ним.Я НЕ знаю некоторые из запросов заранее, поэтому они должны обрабатываться с помощью двухсторонней связи.

Как я могу читать из Программы # 3, используя стандартный вывод Popen?Бонусные баллы: Почему Программы № 2 и № 3 работают так по-разному?

1 Ответ

0 голосов
/ 19 декабря 2018

Поскольку буфер не сбрасывается после операторов printf(), я нашел обходной путь использования stdbuf -o0, заставляющий рассматриваемое приложение буферизовать свои выходные данные (или в этом случае отключить буферизацию).Это исправляет все связанные с этим проблемы и прекрасно справляется с этими задачами.Спасибо респондентам!

...