Мне нужно сделать что-то вроде этот пост, но мне нужно создать подпроцесс, который может много раз получать входные данные и выдавать выходные данные. Принятый ответ на этот пост имеет хороший код...
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
Но, увы, я получаю следующую ошибку:
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:
$ 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
. Как я могу получить вывод для каждого слова по одному?
.after
?) на слово 3. повторить 1-2 - person jfs   schedule 20.02.2015