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

Я пытаюсь написать программу 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 выполнять эту работу за вас.

  • как писать в stdout после вызова метода (с помощью автоматической системы уведомлений (Iphone))
  • Запуск интерактивной команды изнутри python
  • Получение результата в реальном времени из ffmpeg для использования в индикаторе выполнения (PyQt4, stdout)
  • Стандартная идиома Python для установки буфера sys.stdout в ноль не работает с Unicode
  • Внедрение стандартного вывода другой программы для небуферизации с использованием Python
  • Почему sys.getdefaultencoding () отличается от sys.stdout.encoding и как это прерывает строки Unicode?
  • Захват stdout из скрипта в Python
  • Как получить информацию «в реальном времени» из подпроцесса. Открыть в python (2.5)
  • Захват вывода из буферизованной программы StdOut
  • Получить STDOUT, STDERR, не дожидаясь завершения процесса
  • Объединить и синхронизировать stdout и stderr?
  •  
    Interesting Posts for Van-Lav

    Запись изображения pandas / matplotlib непосредственно в файл XLSX

    Форма ввода LSTM в нейронной сети из кадра данных

    Две переменные в Python имеют одинаковый идентификатор, но не списки или кортежи

    Python-просит как вызвать функцию js для вычисления некоторого значения перед публикацией?

    SqlAlchemy эквивалент строки соединения podbcc с использованием FreeTDS

    Динамически называют процессы

    Черепаха от руки

    СинтаксисError: недопустимый токен в datetime.datetime (2012,05,22,09,03,41)?

    Сравните два файла и напишите в новый файл, но выведите только несколько строк?

    Python, HTTPS GET с базовой аутентификацией

    Как избежать замораживания GUI при связывании скрипта muliprocessing python, связанного с gui (скрипт python должен работать в фоновом режиме)

    Как использовать Django 1.8.5 ORM без создания проекта django?

    Как разместить мой набор данных в файле .pkl в точном формате и структуре данных, используемой в «mnist.pkl»?

    Нет модуля с именем «allauth.account.context_processors»

    Ввод целочисленного массива в Python 2

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