Взаимодействовать с интерактивным сценарием оболочки на Python

У меня есть интерактивная оболочка приложения на Windows. Я хотел бы написать скрипт на python, который будет отправлять команды в это приложение оболочки и читать ответы. Однако я хочу сделать это интерактивно, то есть я хочу, чтобы приложение оболочки продолжало работать до тех пор, пока скрипт Python.

я пытался

self.m_process subprocess.Popen(path_to_shell_app,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,universal_newlines=True)

а затем с помощью stdin и stdout для отправки и получения данных. кажется, что приложение оболочки открывается, но я не могу общаться с ним.

Что я делаю неправильно?

2 ответа

Существует модуль, который был построен только для этого: pexpect. Использовать, import pexpect, а затем использовать process = pexpect.spawn(myprogram) создавать новые подпроцессы и использовать process.expect(mystring) или же process.expect_exact(mystring) искать подсказки или получать ответы. process.send(myinput) а также process.sendline(myinput) используются для отправки информации в подпроцесс.

Далее вы должны использовать общаться

stdout, stderr = self.m_process.communicate(input=your_input_here)

Из документации модуля подпроцесса

Popen.communicate(вход = нет)
Взаимодействовать с процессом: отправлять данные в stdin. Читайте данные из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательный входной аргумент должен быть строкой, которая будет отправлена ​​дочернему процессу, или None, если никакие данные не должны быть отправлены дочернему процессу.

connect () возвращает кортеж (stdoutdata, stderrdata).

Обратите внимание, что если вы хотите отправить данные в стандартный процесс, вам нужно создать объект Popen с stdin=PIPE. Точно так же, чтобы получить что-то кроме None в кортеже результата, вам нужно также указать stdout=PIPE и / или stderr=PIPE.

Другие вопросы по тегам