Как мне взаимодействовать с консольным приложением, как будто я пользователь набираю в него что-то?

Я пытаюсь написать программу Python, которая взаимодействует с программой bsdgames trek. Это похоже на Zork с клингонами:

* * * STARTREK * * * Press return to continue. What length game: short What skill game: fair Enter a password: hunter2 10 Klingons 2 starbases at 3,6, 0,2 It takes 400 units to kill a Klingon Command: 

В настоящее время я пытаюсь использовать subprocess.Popen() для взаимодействия с ним:

 >>> import subprocess >>> t = subprocess.Popen('trek', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

К сожалению:

 >>> t.communicate('') ('', None) >>> t.poll() -2 >>> t.communicate('') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 754, in communicate return self._communicate(input) File "/usr/lib/python2.7/subprocess.py", line 1297, in _communicate self.stdin.flush() ValueError: I/O operation on closed file 

Он заканчивается сам, как только я .communicate() с ним. Кажется, я отвечаю на мой первый .communicate() :

 >>> t = subprocess.Popen('trek', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) >>> t.communicate('\n') ('\n * * * STARTREK * * *\n\nPress return to continue.\nWhat length game: ', None) 

Но мне нужно иметь возможность читать stdout, чтобы иметь возможность выяснить, какой должен быть следующий stdin. Итак, как я могу отправить материал в stdin, не делая того, что говорит trek, что это конец его ввода?

EDIT: Кто-то предложил t.stdin.write() . Это работает, но теперь я не могу найти способ прочитать результаты:

 >>> t.stdin.write('\n') >>> t.poll() >>> t.stdout.read() 

Это вечно вечно:

 ^CTraceback (most recent call last): File "<stdin>", line 1, in <module> KeyboardInterrupt >>> t.stdout.readline() '' 

Итак, что теперь происходит?

One Solution collect form web for “Как мне взаимодействовать с консольным приложением, как будто я пользователь набираю в него что-то?”

Предполагая, что это linux, используйте модуль pexpect . Он написан для работы с интерактивными программами. Такие методы, как communication (), не работают, потому что они ждут выхода программы. Просто чтение не работает, потому что программа не покраснела, поэтому читать нечего. Вы можете создать свой собственный pty и использовать его при вызове Popen () или позволить pexpect выполнять эту работу за вас.

  • Перенаправление stdio из команды в os.system () в Python
  • Получение вывода команды скрытой консоли?
  • python - как я могу перенаправить вывод unittest? Очевидное решение не работает
  • Подпроцесс Python с / usr / bin / time: как записывать информацию о времени, но игнорировать все остальные данные?
  • python: узнать, работает ли в оболочке или нет (например, очередь двигателя решетки солнца)
  • Перенаправить stdout в файл в Python?
  • Python 2.x - записать двоичный вывод в stdout?
  • Как наследовать stdin и stdout в python с помощью os.execv ()
  • Получение всей информации из подпроцесса.
  • Чтение stdout из работающего скрипта с Python
  • Как отключить и снова включить ведение журнала консоли в Python?
  •  
    Interesting Posts for Van-Lav

    Как получить строки между одним и тем же шаблоном с помощью python regex

    Django Sass Compressor django_libsass.SassCompiler: команда не найдена

    Работа с предками в GAE

    Как вы инициализируете переменную gensim corpus с помощью csr_matrix?

    Почему shutil.copy () вызывает исключение разрешения, если cp не работает?

    Есть ли способ выводить числа только из списка python?

    Как реализовать подтипируемый класс в Python (подклассный класс, а не объект подкачки)?

    Python Удалить последние 3 символа строки

    Какой модуль RPC следует использовать для реализации RCP в Python и возможность изменить метод подключения позже?

    Использование virtualenv с Sublime Text 3 и SublimeREPL

    ImportError: нет модуля с именем ***** в python

    Чрезвычайно странная проблема веб-скрепок: почтовый запрос не ведет себя так, как ожидалось

    Помещение `Cookie` в` CookieJar`

    Сравнение многопроцессорного модуля и пиро?

    ожидание ввода пользователя в отдельный поток

    Python - лучший язык программирования в мире.