Как я могу использовать Python для автоматизации внешнего.exe, который принимает несколько пользовательских вводов в интерактивном режиме в командной строке Windows?
У меня есть исполняемый файл, который я могу запустить в интерактивном режиме из командной строки Windows. Рабочий процесс выглядит следующим образом:
C:\Users\Me> my_executable.exe # Running the executable from CMD
Welcome! Please choose one:
0: Exit
1: Sub-task 1
2: Sub-task 2
Enter your input: 2 # I entered this interactively
Sub-task 2 chosen.
Please choose next option:
0: Return to previous menu
1: Connect to server
2: Disconnect from server
3: Call server API 1
4: Call server API 2
Enter your input: 1 # I entered this interactively
Полный рабочий процесс сложен и занимает несколько проходов (один раз через подзадачу 1, затем через подзадачу 2 и т. Д.).
Я хотел бы автоматизировать это с помощью Python. Я пытался использовать модуль подпроцесса для достижения этой цели. Тем не менее, я, кажется, провалился на самой стадии.Popen.
Вот аналогичный вопрос о Stackru. Я пытался использовать тот же подход, используя.Popen. Вот что я вижу:
C:\Users\Me> python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen, PIPE
>>> p = Popen('my-executable.exe', stdin=PIPE)
Traceback (most recent call last):
file "<stdin>", line 1 in <module>
TypeError: unsupported operand type(s) for -:'Popen' and 'Popen'
>>> Welcome! Please choose one:
0: Exit
1: Sub-task 1
2: Sub-task 2
Enter your input: 2 # I am forced to enter this input here.
2 # Python echoes 2 before returning to prompt
>>> # Back to Python prompt
Может кто-нибудь помочь с тем, что я делаю не так?
1 ответ
Я не знаю правильного решения, но если я могу сказать следующее.
Обычно при использовании внешнего процесса для обработки некоторых входных данных или для выполнения какой-либо задачи все параметры вводятся как строковые аргументы.
Как это: my-task.exe arg1 arg2...
Это плохая практика иметь подпроцессы, которые требуют дальнейшего ввода пользователем.
Если вы тот, кто написал exe-процесс, то лучше всего переписать его, как упоминалось ранее.
Однако вполне приемлемо обмениваться данными, используя надлежащий IPC, т.е. Отправлять входы и получать выходы. (Как с использованием сокетов)
В кадре никогда не позволяйте подпроцессу напрямую запрашивать ввод у пользователя.