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
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
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
hace. ¿Cómo puedo obtener la salida de cada palabra, una a la vez?