Взаимодействовать с интерактивным сценарием оболочки на 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.