Mehrere Ein- und Ausgänge im Python-Unterprozess kommunizieren

Ich muss so etwas tun wiedieser Beitra, aber ich muss einen Unterprozess erstellen, der mehrmals eingegeben und ausgegeben werden kann. Die akzeptierte Antwort auf diesen Beitrag hat einen guten Code ...

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

... dass ich so weitermachen möchte:

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

# french fries

Aber leider bekomme ich den folgenden Fehler:

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

Die proc.stdin.write () -Methode ermöglicht es Ihnen nicht, Ausgaben zu sammeln, wenn ich das richtig verstehe. Was ist der einfachste Weg, um die Leitungen für die laufende Eingabe / Ausgabe offen zu halten?

Edit: ====================

Es sieht aus wiepexpect ist eine nützliche Bibliothek für das, was ich versuche, aber ich habe Probleme, es zum Laufen zu bringen. Hier ist eine ausführlichere Erklärung meiner eigentlichen Aufgabe. Ich benutzehfst, um Grammatikanalysen einzelner (russischer) Wörter zu erhalten. Das Folgende demonstriert sein Verhalten in einer Bash-Shell:

$ 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

> 

Ich möchte, dass mein Skript die Analysen eines Formulars gleichzeitig abruft. Ich habe versucht, Code wie folgt, aber es funktioniert nicht.

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
# 
# 

Ich habe offensichtlich falsch verstanden, waspexpect.before tut. Wie kann ich die Ausgabe für jedes Wort einzeln abrufen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage