Взаимодействие с другой программой командной строки в Python - PullRequest
8 голосов
/ 20 июня 2009

Мне нужно написать скрипт Python, который может запускать другую программу командной строки и взаимодействовать с ее потоками stdin и stdout. По сути, скрипт Python будет читать из целевой программы командной строки, интеллектуально отвечать, записывая в свой стандартный ввод, а затем снова считывать результаты из программы. (Это будет повторяться.)

Я просмотрел модуль подпроцесса и, похоже, не могу заставить его делать то, что мне нужно для чтения / записи / чтения / записи. Есть что-то еще, что я должен попробовать?

Ответы [ 2 ]

7 голосов
/ 20 июня 2009

Для выполнения такого подробного взаимодействия (когда, вне вашего контроля, другая программа может буферизовать свой вывод, если она не думает, что разговаривает с терминалом) требуется что-то вроде pexpect - что в свою очередь требует pty, стандартный модуль библиотеки Python, который (в операционных системах, которые позволяют это, например, Linux и Mac OS x) реализует «псевдо-терминалы».

Жизнь в Windows сложнее, но, может быть, этот zipfile может помочь - это должен быть порт pexpect для Windows (извините, у меня нет машины с Windows, чтобы проверить его). Данный проект, называемый wexpect, живет здесь .

4 голосов
/ 20 июня 2009

см вопрос wxPython: как создать окно оболочки bash?

там я дал полноценное взаимодействие с оболочкой bash чтение stdout и stderr и общение через stdin

Основная часть является расширением этого кода

bp = Popen('bash', shell=False, stdout=PIPE, stdin=PIPE, stderr=PIPE)
bp.stdin.write("ls\n")
bp.stdout.readline()

если мы прочитаем все данные, они будут заблокированы, поэтому ссылка на скрипт, который я дал, сделает это в потоке Это полное приложение wxpython, частично имитирующее оболочку bash.

...