Múltiples entradas y salidas en subproceso de python se comunican

Necesito hacer algo comoesta publicación, pero necesito crear un subproceso que pueda recibir entrada y dar salida muchas veces. La respuesta aceptada de esa publicación tiene un buen código ...

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)    
grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print(grep_stdout.decode())

# four
# five

... que me gustaría continuar así:

grep_stdout2 = p.communicate(input=b'spam\neggs\nfrench fries\nbacon\nspam\nspam\n')[0]
print(grep_stdout2.decode())

# french fries

Pero, por desgracia, me sale el siguiente error:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 928, in communicate
    raise ValueError("Cannot send input after starting communication")
ValueError: Cannot send input after starting communication

El método proc.stdin.write () no le permite recopilar resultados, si lo entiendo correctamente. ¿Cuál es la forma más sencilla de mantener abiertas las líneas para la entrada / salida en curso?

Editar: ====================

Parece quepexpect&nbsp;es una biblioteca útil para lo que intento hacer, pero tengo problemas para que funcione. Aquí hay una explicación más completa de mi tarea real. estoy usandohfst&nbsp;para obtener análisis gramaticales de palabras individuales (rusas). Lo siguiente demuestra su comportamiento en un shell bash:

$ hfst-lookup analyser-gt-desc.hfstol
> слово
слово   слово+N+Neu+Inan+Sg+Acc 0.000000
слово   слово+N+Neu+Inan+Sg+Nom 0.000000

> сработай
сработай    сработать+V+Perf+IV+Imp+Sg2 0.000000
сработай    сработать+V+Perf+TV+Imp+Sg2 0.000000

> 

Quiero que mi script pueda obtener los análisis de un formulario a la vez. Intenté un código como este, pero no funciona.

import pexpect

analyzer = pexpect.spawnu('hfst-lookup analyser-gt-desc.hfstol')
for newWord in ['слово','сработай'] :
    print('Trying', newWord, '...')
    analyzer.expect('> ')
    analyzer.sendline( newWord )
    print(analyzer.before)

# trying слово ...
# 
# trying сработай ...
# слово
# слово слово+N+Neu+Inan+Sg+Acc 0.000000
# слово слово+N+Neu+Inan+Sg+Nom 0.000000
# 
# 

Obviamente he entendido malpexpect.before&nbsp;hace. ¿Cómo puedo obtener la salida de cada palabra, una a la vez?