Как я могу использовать Python для автоматизации внешнего .exe, который принимает несколько пользовательских вводов в интерактивном режиме в командной строке Windows? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть исполняемый файл, который я могу запустить в интерактивном режиме из командной строки 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.

Вот аналогичный вопрос в StackOverflow. Я пытался использовать тот же подход, используя .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 Ответ

0 голосов
/ 09 сентября 2018

Я не знаю правильного решения, но могу ли я сказать следующее.

Обычно при использовании внешнего процесса для обработки некоторых входных данных или для выполнения какой-либо задачи все параметры вводятся как строковые аргументы.

Как это: my-task.exe arg1 arg2...

Это плохая практика иметь подпроцессы, которые требуют дальнейшего ввода пользователем.

Если вы - тот, кто написал exe-процесс, то лучше всего переписать его, как упоминалось ранее.

Вполне приемлемо, однако, обмениваться данными, используя надлежащий IPC, т.е. Отправлять входы и получать выходы. (Как с использованием сокетов)

В кадре никогда не позволяйте подпроцессу напрямую запрашивать ввод у пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...