У меня три программы.Первый - это просто тестирование чтения с 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 работают так по-разному?