python子进程中的多个输入和输出进行通信


问题内容

我需要做类似这篇文章的事情,但是我需要创建一个子进程,可以给它多次输入和输出。该帖子的公认答案具有良好的代码…

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

…我想继续这样:

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

# french fries

但是a,我收到以下错误:

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

如果我理解正确,那么proc.stdin.write()方法将使您无法收集输出。保持线路连续进行输入/输出的最简单方法是什么?

编辑:====================

看来这pexpect是一个有用的库,可用来做我想做的事情,但我无法使其正常工作。这是我实际任务的更完整说明。我正在使用hfst单个(俄语)单词的语法分析。下面展示了其在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

>

我希望我的脚本能够一次获得一种形式的分析。我尝试过这样的代码,但无法正常工作。

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

我显然误解了pexpect.before。如何获得每个单词的输出,一次一个?


问题答案:

此答案应归因于@JFSebastian。感谢您的评论!

以下代码获得了我的预期行为:

import pexpect

analyzer = pexpect.spawn('hfst-lookup analyser-gt-desc.hfstol', encoding='utf-8')
analyzer.expect('> ')

for word in ['слово', 'сработай']:
    print('Trying', word, '...')
    analyzer.sendline(word)
    analyzer.expect('> ')
    print(analyzer.before)