Использование подпроцесса python для взаимодействия с приложением командной строки, которое запрашивает данные неупорядоченным образом

#python #subprocess

Вопрос:

Я пишу программу на python, которая должна взаимодействовать с другим консольным приложением Windows. Я использую subprocess для этого, но у меня возникли некоторые проблемы, потому что это приложение для Windows случайным образом запрашивает входные данные при каждом звонке.

Например: app.exe при первом звонке спросите об этом заказе:
Имя: введите здесь
Место: введите здесь
Возраст: введите здесь

app.exe при повторном звонке спросите об этом заказе:
Место: введите здесь
Имя: введите здесь
Возраст: введите здесь

Поэтому, когда я использую:

process = subprocess.Popen("app.exe", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Из-за этого случайного представления мне нужно прочитать каждую строку перед использованием process.stdin.write() flush() , и в этом заключается проблема, process.stdout.readline() метод заблокирован, поскольку, по-видимому, строка не содержит символа конца строки из-за ввода, которого она ожидает. Я читал характер за характером, используя process.stdout.readline(1).decode() , но я думаю, что есть лучший способ справиться с этим.

Пожалуйста, если кто-нибудь знает, как с этим справиться, я буду признателен за вашу помощь
Лучшим Регадам!

Обновление*
Еще один пример

process.stdout.readline().decode() прочитайте строку, если эта строка представляет собой просто текст и в ней нет курсора, ожидающего ввода.
например:
Привет, это первая строка на консоли.
Введите свое имя в этой строке: input_here

Здесь первая строка читается без проблем. Но второй он не читается, потому что ждет ввода.

Комментарии:

1. Я предполагаю, что вы сами это создали app.exe . Почему бы вам GUI widget не задавать вопросы в своем приложении, а не задавать их в консоли.

2. @Ситиз app.exe оно создано не мной, это приложение уже существует и не подлежит замене. И да, я использую графический интерфейс из python (QT). но мне нужно взаимодействовать с app.exe

3. Теперь я не думаю, что понял ваш вопрос, не могли бы вы, пожалуйста, объяснить мне немного яснее? Если возможно, с примером, о котором еще не идет речь? @Хавьер, ты говоришь process.stdout.readline(1).decode() , что это работает на тебя?

4. @Xitiz Из приложения с графическим интерфейсом python, когда я нажимаю на кнопку, приложение должно запустить инструмент командной строки, установленный в системе, и предоставить данные в интерактивном режиме. Проблема в том, что я не знаю, в каком порядке этот инструмент командной строки запрашивает данные. Вот почему мне нужно прочитать строку stdout, в которой запрашивается значение, а затем с помощью некоторых условий определить, что запрашивает инструмент. Да, process.stdout.readline(x).decode() я могу прочитать x символов в каждой строке и определить, что запрашивает инструмент через консоль.

5. это работает на тебя?

Ответ №1:

Я действительно не знаю, поможет ли это вам решить вашу проблему, но вот идея :

 process.stdout.readline().decode()
 

Эта строка отлично работает для одной строки, затем проверьте по очереди, есть ли в ней «Имя» или нет, «Место», например

 if "Name" in <>:
    # Something
elif "Place" in <>:
    # Something
else:
    # Something
 

Комментарии:

1. это было мое первое предложение по моему коду, но process.stdout.readline().decode() я не могу прочитать строку, когда она ожидает входных данных.

2. На самом деле, все, о чем говорится в вашем <br>, — это n в python.

3. Извините, я пытался отформатировать комментарий. Я поместил это в качестве обновления в вопросе

4. Вы заметили, в чем проблема с этим обновлением?