#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. Вы заметили, в чем проблема с этим обновлением?