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?